Einlesen von Daten aus Datei, letzte Zeile doppelt
-
Hallo!
Ich habe hier einen Effekt, den ich nicht verstehe.
Ich möchte aus einer ASCII-Datei zeilenweise einlesen:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE * file; char Line[81]; char Input[]="Input.txt"; file = fopen(Input,"r"); if (file){ while (!feof(file)){ fgets(Line,80,file); printf("%s",Line); } //(!feof(file)) }// if (file) fclose(file); return EXIT_SUCCESS; }
Wenn ich mir die Bildschirmausgabe dann anschaue, dann ist die letzte Zeile doppelt vorhanden.
Woher kommt das und kann man das evt. "abschalten"?
Ciao
OkkaPapa
-
Das liegt daran, dass du die Abbruchbedingung mittels feof realisierst (wahrscheinlich irgendwo aufgeschnappt) statt direkt den Rückgabewert von fgets auszuwerten.
-
Die letzte Zeile wird eingelesen. Demnach gibt es noch kein
EOF
.
Beim nächsten lesen mit fgets wird aberEOF
erkannt bevor ein Zeichen gelesen wurde.fgets
ändert darum nichts am Inhalt von Line.
Der wird aber trotzdem ausgegeben.Das Abfragen mit
feof()
hat auch keinen Zweck, bevor eine Leseoperation erfolgt.Verzichte auf
feof()
und nimm zum testen den Rückgabewert vonfgets
-
Wutz schrieb:
Das liegt daran, dass du die Abbruchbedingung mittels feof realisierst (wahrscheinlich irgendwo aufgeschnappt) statt direkt den Rückgabewert von fgets auszuwerten.
Aufgeschnappt... so kann man es nennen.
Im C-Kurs hat mir der Vortragende das so beigebracht, mit den Worten "Ohhhhh, eine echte Anwendung!"
Schade, daß ich im Nachhinein den Bewertungszettel nicht mehr ändern kann...
Aber: while(fgets(Line,80,file)) tut es!
Danke!
Ciao
OkkaPapa
-
OkkaPapa schrieb:
char Line[81]; ... fgets(Line,80,file);
Bei
fgets
darfst du die die Länge vom ganzen zur Verfügung stehenden Speicher angeben. Hier also die 81 (sonst werden nur 79 Zeichen eingelesen).