while((c = fgetc(p_list)) != EOF):Problem für das Ende einer Datei???



  • Mein Programm muss eine Liste auslesen.

    Meine Liste heißt "test.txt" und beinhaltet:
    A12345678
    A23456789
    A34567890
    und mein Programm sieht so aus:

    int c;
    FILE *fp;
    char Puffer[30] = "";
    
    	if ( (fp = fopen("tst.txt","r")) == NULL ){
    		puts("Die Liste ist nicht geoefnet!\n");
    	}
    
    		while ((c = fgetc(p_list)) != EOF){
    		fgets(Puffer, sizeof(Puffer), fp);
    		printf ("\t%s\n", Puffer);
    		}
    
    	if ( (fclose(fp) != 0) ){
    		puts ("Die Liste ist nicht geschlossen\n");
    	}	
    ...
    

    Das Problem ist dass das Programm gibt die Liste so aus:
    12345678
    23456789
    34567890

    Das erste Element ist weg? Weiß einer vielleicht warum?

    Danke im voraus
    kim16



  • Ist nur ne Vermutung: Mit c = fgetc(...) liest du ja schon den ersten Buchstaben ein und liest dann erst den Rest der Zeile in deinen String.



  • Die Vermutung ist völlig richtig.



  • Und um das Problem zu lösen, kannst du entweder per man: ungetc dieses erste Zeichen wieder zurückschreiben, es vor dem fgets()-Aufruf in deinen Puffer schreiben (und dann Puffer+1 als Startpunkt für fgets() verwenden) oder per man: feof testen, ob dein File schon zu Ende ist.



  • fgets gibt am Ende der Datei NULL zurück, wie wärs damit ... BTW dein Test, ob die Datei geöffnet werden konnte, ist nicht wirklich sinnvoll: Du solltest das Programm danach abbrechen und nicht aus der nicht geöffneten Datei versuchen irgendwas zu lesen.



  • sorry aber es geht immer noch nicht:
    ich habe auch so mit feof():

    while ( !feof(fp) )
    

    aber so kriege ich die letzte Zeile von meiner Liste doppellt gelesen?



  • So gehts:

    #include <stdio.h>
    
    int main(void)
    {
    
    	FILE *fp;
    	char Puffer[30] = "";
    
    	if ( (fp = fopen("test.txt","r")) == NULL ){
    
    		puts("Die Liste ist nicht geoeffnet!\n");
    	} else {
    
    		while (fgets(Puffer, sizeof(Puffer), fp) != NULL){
    
    			printf ("\t%s\n", Puffer);
    		}
    
    		if ( (fclose(fp) != 0) ){
    
    			puts ("Die Liste ist nicht geschlossen\n");
    		}
    	}
    
    	return 0;
    }
    


  • kim16 schrieb:

    sorry aber es geht immer noch nicht:
    ich habe auch so mit feof():

    while ( !feof(fp) )
    

    aber so kriege ich die letzte Zeile von meiner Liste doppellt gelesen?

    Du bekommst die Zeile mit Sicherheit nicht zweimal gelesen, Du hast wahrscheinlich nur nicht abgefragt ob fgets Erfolg hatte. Damit gibst Du (wenn die Ausgabe unmittelbar nach dem Lesen erfolgt) schlicht und ergreifend die letzte Zeile nochmal aus.



  • VIELEN DANK! 👍 👍 👍

    JETZT HAT ES GEKLAPPT 😃 😃 😃

    GRUSS 😉
    KIM16


Anmelden zum Antworten