zeilenweise aus datei lesen



  • hi, habe folgendes problem: und zwar habe ich eine Datei die wie folgt aussieht:

    test.txt

    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    
    blablablablablablablabla
    blablablablablablablabla
    
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
             ....
    

    Es handelt sich um eine einfache Textdatei, in der irgendwas drin steht, nur leider ab und zu eine zeile leer ist.
    Ich möchte jetzt diese Datei (mit fgets?) einlesen und alle Leerzeilen entfernen und unter dem gleichen Namen wieder speichern (quasi überschreiben). Wie kann ich das am schnellsten und am einfachsten machen?
    So soll die test.txt später aussehen:

    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    blablablablablablablabla
    

    Kann mir jemand helfen? Vielen Dank im Voraus...



  • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fscanf.2c_.fwscanf.asp

    int main(int argc, char *argv[])
    {
        FILE *in; in = fopen("test.in", "r");
    	FILE *out; out = fopen("test.out", "w");
    
    	for(int i = 0; i < nZeilen/*anzahl der zeilen*/; ++i)
    	{
    	   char szBuffer[1024] = {0};
    
    	   if(fscanf(in, "%s\n", szBuffer) != 0)
    			fprintf(out, "%s\n", szBuffer);
    	}
    
    	fclose(in);
    	fclose(out);
    }
    


  • Machs besser mit fgets() und überprüfe den Buffer, ob nur ein \n enthalten ist (= Leerzeile).

    @miller_m
    fscanf() liest so nur bis zum nächsten White-Space-Char, aber nicht zum Zeilenende.



  • ich habe das selbe problem. meine blokade: ich weiss nicht, wie ich auf "\n" überprüfe.

    while(fgets(puffer, zeile, pOutput))
    	{	
    		if(puffer != '\n')
    			fputs(puffer, stdout);
    	}
    

    soll bewirken, dass keine leeren zeilen gedruckt werden...



  • strcmp, strlen, strstr

    http://www.cppreference.com/



  • strstr ist ja blöd, da in jeder zeile ein "\n" vorkommt.
    wozu strlen?
    bei strcmp bekomme ich:

    fac.c:77: warning: passing arg 1 of `_IO_putc' makes integer from pointer without a cast
    
    while(fgets(puffer, zeile, pOutput))
    	{	
    		if(strcmp(puffer, "\n") != 0)
    			putc(puffer, stdout);
    	}
    


  • lol, die fehlermeldung interpretierst du gefälligst selbst.
    debuggen ist der einfachste teil am programmieren.



  • hmm, aus der bemerkung lerne ich leider nicht viel...



  • eine leerzeile ist eine zeile, die nur aus whitespaces besteht. du muß nur alle zeichen der zeile durchlaufen und wenn du auf etwas anderes als ein whitespace stößt (!isspace(c)), dann gebe die zeile aus. isspace() ist in <ctype.h> deklariert.



  • @iso
    du mußt fputs() und nicht putc() verwenden.



  • ist ctype.h ansi?



  • ja



  • while(fgets(puffer, zeile, pOutput))
    	{	
    		if(puffer != '\n')
    			puts(puffer);	
    	}
    

    gibt:

    warning: comparison between pointer and integer

    gilt für die if-zeile

    ich komm hier irgendwie nicht weiter...



  • puffer ist ein char*
    '\n' ist ein char

    char* ist ein pointer
    char ist ein integer

    warning: comparison between pointer and integer

    was heißt das jetz wohl?
    dass er dich *warnt*, dass du nen zeiger und ne zahl vergleichst.

    kriegst du das nicht selber raus?
    wenn nicht, lerne es lieber schnell. weil das begegnet dir beim programmieren oft.

    (edit: die zeile war mir keinen neuen post wert)
    freut mich, dass es richtig angekommen ist, ISO 😃



  • da ist ja der nette kerl wieder, der immer nen dummen spruch zu drücken hat



  • dieser aussage entnehme ich, dass ich puffer nicht mit '\n', sondern mit einem zeiger, der auf die speicherstelle, welche \n enthält, vergleichen soll?
    moment...

    ich müsste die inhalte der speicherstellen der beiden zeiger vergleichen...

    wie war das noch...

    &puffer == &cNewline ??

    hier mal zur übersicht der gesamte code. ich habe ja vielleicht bei der deklaration der char was falsch gemacht?

    #include <stdio.h>
    #include <string.h>
    
    #define input "finder_input.html"
    #define output "finder_output.txt"
    #define zeile 20
    
    int main(void)
    {
    	FILE *pInput;
    	FILE *pOutput;
    	int c, d, i=1, iZeilecount=1, iPufferlen=1;
    	char puffer[zeile], cNewline[]="\n";
    
    	pInput = fopen (input,"r");
    	if (!pInput)
    		printf ("\n\tDatei [pInput] laesst sich nicht oeffnen\n");
    
    	pOutput = fopen (output,"w");
    	if (!pOutput)
    		printf ("\n\tDatei [pOutput] laesst sich nicht oeffnen\n");
    
    	while ((c = getc(pInput)) != EOF)
    	{
    		if (c == '>')
    		{
    			while ((d = getc(pInput)) != EOF)
    			{
    				if (d == '<')
    					break;
    				fputc(d, pOutput);
    			}
    		}
    	}
    // -----------------------------------------------------------------------
    // Dateien schliessen
    	fclose (pInput);
    	if (!fclose)
    		printf("\n\tAchtung, Datei [pInput] nicht geschlossen\n");
    	fclose (pOutput);
    	if (!fclose)
    		printf("\n\tAchtung, Datei [pOutput] nicht geschlossen\n");
    // ------------------------------------------------------------------------
    	pOutput = fopen (output, "r");
    	if (!pOutput)
    		printf ("\n\tDatei [pOutput] laesst sich nicht oeffnen\n");
    // ------------------------------------------------------------------------
    // pOutput sortieren
    	while(fgets(puffer, zeile, pOutput))
    	{	
    		iZeilecount++;
    		iPufferlen=strlen(puffer);
    
    		if(*puffer != *cNewline)
    		{
    			puts(puffer);
    			printf("%i", iPufferlen);
    		}
    	}
    	printf("\n\nDiese Datei hat %i Zeilen\n\n", iZeilecount);
    // ------------------------------------------------------------------------
    // pOutput schliessen
    	fclose (pOutput);
    	if (!fclose)
    		printf("\n\tAchtung, Datei [pOutput] nicht geschlossen\n");
    return 0;
    }
    




  • ja, danke. das hatten wir schon!

    aktuell:

    while(fgets(puffer, zeile, pOutput))
    	{	
    		if(strcmp(cNewline, puffer) != 0)
    		{
    			fputs(puffer, stdout);
    		}
    	}
    

    leider ändert das an der output-datei überhauptnix! der vergleich != bringt alle zeilen, der vergleich == bring dasselbe!



  • http://www.cppreference.com/stdstring/strstr.html
    (strstr(a,b) == a) sollte ähnlich wirken

    also wenn
    a = "cppreference..." und
    b = "cppreference"
    dann geht strstr. umgedreht allerdings nicht.



  • The function strstr() returns a pointer to the first occurrence of str2 in str1, or NULL if no match is found.

    das sagt mir, dass nach \n irgendwo in dem string gesucht würde. es ist aber in jeder zeile ein \n vorhanden... (jede zeile hat ein ende, nur die wurst hat zwei)

    mein ziel ist es aber, festzustellen, ob \n der einzige inhalt des string ist. ist das der fall, soll die zeile nicht gedruckt werden (weder auf dem Bildschirm noch in eine datei)

    aber geht das überhaupt so? ist wegen getc nicht noch zusätzlich ein \0 in jeder zeile?


Anmelden zum Antworten