zeilenweise aus datei lesen



  • 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?



  • hm, dann vll ein strcmp() mit "\n" oder "\r\n"?
    oder du schreibst dir ne trimfunktion, die das \n (und vll auch \r) am ende wegnullt und dann strlen() drauf



  • eingentlich sollte deine korrigierte schleife funktionieren...

    das es trotzdem nicht geht könnte daran liegen, das die leerzeilen vielleicht neben dem new-line auch noch leerzeichen enthalten.

    und es gibt noch eine andere möglichkeit. die dateinamen "finder_input.html" etc lassen darauf schließen, daß du auf einem apple programmierst. ich kenn mich zwar mit dem apple nicht aus, aber ich habe gehört, daß der als zeilenende carriage-return benutzt. eigentlich sollte die ansi-c-dateifunktionen das cr nach lf übersetzten, aber möglicherweise hat die bibliothek deines compilers ja einen fehler. versuche also einfach mal, die zeilen mit "\r" anstelle von "\n" zu vergleichen.

    außerdem wäre es noch sinnvoll, das makro zeile von 20 auf 256 oder so zu setzten. 20 zeichen pro zeile sind schon ein bißchen wenig. das ist zwar kein richtiger fehler, würde aber dazu führen, daß dein programm eine zeile in mehrere zerlegt. davon merkst du zwar normalerweise nichts, da, wenn die zeile unvollständig eingelesen wird, auch kein nl in der gelesenen zeile drin ist, aber deine testausgabe printf("%i", iPufferlen) würde dann mitten in der zeile erscheinen.



  • Die 20 Zeichen reichen aus, ich schau mir ja die ausgabe an. ich habe mal die zeilenlängen zählen lassen, die leerzeilen enthalten sehr häufig 2! zeichen. also \n +\0 ??

    ich schreibe auf einem normalen pc mit suse 9.2.

    vielleicht bin ich ja nicht in der lage, das mit c zu machen... ich schau mir mal perl an, stringmaipulation soll ja dessen große stärke sein. schade nur um die zeit bis jetzt.

    vielen dank für eure hilfe


Anmelden zum Antworten