Heim >Backend-Entwicklung >C++ >Warum wiederholt meine EOF-Prüfung beim Lesen einer Textdatei die letzte Zeile?

Warum wiederholt meine EOF-Prüfung beim Lesen einer Textdatei die letzte Zeile?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-31 12:18:09785Durchsuche

Why Does My EOF Check Repeat the Last Line When Reading a Text File?

Doppelter Fehler: EOF wiederholt die letzte Zeile beim Lesen einer Textdatei

Der fragliche Code zielt darauf ab, ganze Zahlen Zeile für Zeile aus einer Textdatei zu lesen bis zum Erreichen der End-of-File-Anzeige (EOF). Die letzte Iteration liest jedoch unerwarteterweise die letzte Ganzzahl zweimal.

Ursache des Problems:

Das Problem liegt in der Art des Dateilesens. Wenn der Eingabestream die EOF-Marke erreicht, wird das ios::eofbit erhöht. Dieses Bit zeigt an, dass der letzte Lesevorgang auf das EOF gestoßen ist und nicht, dass sich der Stream am Ende der Datei befindet.

Detaillierte Analyse:

Betrachten Sie die folgende Ereignissequenz :

  1. Lesen Sie die Ganzzahl 10.
  2. Lesen Sie die Ganzzahl 20.
  3. Lesen Sie die Ganzzahl 30.
  4. Begegnen Sie dem EOF nach dem Lesen von 30.

In der letzten Iteration ist die Ganzzahl 30 immer noch der aktuelle Wert im Eingabestrom. Wenn das EOF auftritt, wird das ios::eofbit erhöht, aber der Wert von x bleibt 30. Der Code gibt dann den Wert von x (der 30 ist) aus und prüft, ob EOF in der Schleifenbedingung vorhanden ist. Da EOF nun festgelegt ist, verlässt das Programm die Schleife.

Vorgeschlagene Lösung:

Um diesen Fehler zu beheben, ersetzen Sie die Schleifenbedingung durch eine explizitere Prüfung für EOF:

while (true) {
    int x;
    iFile >> x;
    if (iFile.eof()) break;
    cerr << x << endl;
}

Durch die explizite Prüfung auf EOF nach jedem Lesevorgang stellt der Code sicher, dass die letzte Ganzzahl nicht gelesen und gedruckt wird zweimal.

Zusätzlicher Fehler:

Dem Originalcode fehlt auch die Fehlerprüfung. Wenn die Eingabedatei leer ist, wird die Schleife niemals beendet, da das EOF-Bit erst dann erhöht wird, wenn der erste Lesevorgang auf das EOF trifft. Um dies zu verhindern, fügen Sie eine entsprechende Fehlerbehandlung hinzu, bevor Sie versuchen, aus der Datei zu lesen.

Das obige ist der detaillierte Inhalt vonWarum wiederholt meine EOF-Prüfung beim Lesen einer Textdatei die letzte Zeile?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn