feof() schlägt nicht richtig an
-
Hi,
ich habe folgenden Code:
char Buffer[10]; FILE *MyFile = fopen("Demo.txt","w"); fputs("eins\n", MyFile); fputs("zwei\n", MyFile); fputs("drei\n", MyFile); fputs("vier\n", MyFile); fputs("fuenf\n", MyFile); fclose(MyFile); MyFile = fopen("Demo.txt","r"); while (!feof(MyFile)) { fgets(Buffer, 10, MyFile); } fclose(MyFile);
Die Lese-Schleife wird seltsamer Weise sechs mal ausgeführt, wobei beim sechsten Mal ebenfalls "fuenf\n" in Buffer steht. Wie kann ich das korrekt abfangen?
-
fgets liest nur bis zum \n, EOF wird aber erst gesetzt nachdem versucht wurde über das Dateiende hinaus zu lesen. Deshalb ist nach der fünften Zeile noch kein EOF erreicht. Lösung: Überprüfe die Rückgabe von fgets.
-
feof schlägt an, nachdem das erste mal versucht wurde, über das Ende der Datei hinaus zu lesen.
-
Das sieht danach aus, als ob da am Schluss eine "leere Zeile" hängt, die nach dem Lesen von Zeile "Fuenf\n" dafür sorgt, dass feof noch nicht im nächsten while() anspringt.
Dass beim 6ten Durchlauf nochmal "Fuenf" im Buffer steht, liegt wohl daran, dass fgets() nur noch das Dateiende liesst und den Buffer nicht überschreibt. Es ist also nochmal die "Fuenf" vom 5ten Durchlauf.
Schau nochmal nach, wie feof() genau definiert ist. Wie geschrieben, ich tippe darauf, dass es eine 6te Zeile gibt, die nur aus Ctrl-D besteht und feof darauf erst anspringt, wenn ein vorheriges Einlesen mit fgets & Co. dieses Ctrl-D gefressen hat.
-
Jap, mit dem Rückgabewert gehts.
PS: Steht ja auch in der Doku. Man sollte auch bei bekannten Funktionen dort vielleicht hin und wieder mal reinschauen...