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 aber EOF 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 von fgets



  • 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).


Anmelden zum Antworten