Heim >Backend-Entwicklung >C++ >Warum liest mein C-Code bei der Prüfung auf EOF die letzte Zeile einer Textdatei zweimal?

Warum liest mein C-Code bei der Prüfung auf EOF die letzte Zeile einer Textdatei zweimal?

Barbara Streisand
Barbara StreisandOriginal
2024-12-27 15:20:15962Durchsuche

Why Does My C   Code Read the Last Line of a Text File Twice When Checking for EOF?

Fehlerbehebung beim Lesen von EOF aus Textdateien

Beim Lesen aus einer Textdatei bis zum Erreichen des Dateiendes (End-of-File, EOF) ist dies wichtig um das Verhalten des Eingabestreams zu verstehen, um doppelte Zeilen zu vermeiden.

In C wird das ifstream-Objekt zum Lesen aus Text verwendet Dateien. Der bereitgestellte Code veranschaulicht einen gängigen Ansatz zum Lesen von Ganzzahlen aus einer Textdatei, es tritt jedoch ein Problem auf, bei dem die letzte Zeile zweimal gelesen wird.

Verstehen des Problems

Die Das Problem entsteht, weil die Funktion eof() basierend auf dem internen Zeiger des Streams nach EOF sucht, der nach dem letzten Zeichen der Datei positioniert wird, wenn EOF erreicht ist. Der Code liest die letzte Zeile einmal, wenn er auf die Ganzzahl trifft, und noch einmal, wenn er innerhalb der Schleife nach EOF sucht.

Lösung

Um dieses Problem zu beheben, ist es ratsam, dies zu überprüfen für EOF, bevor die Ganzzahl innerhalb der Schleife gelesen wird. Dadurch wird sichergestellt, dass die letzte Ganzzahl nur einmal gelesen wird:

while (!iFile.eof())
{
    if (iFile.peek() != EOF)
    {
        int x;
        iFile >> x;
        cerr << x << endl;
    }
}

Hier prüft iFile.peek() das nächste Zeichen im Stream, ohne es tatsächlich zu lesen. Wenn es sich nicht um EOF handelt, wird die Ganzzahl gelesen und ausgegeben.

Alternativer Ansatz

Zusätzlich kann der Code mithilfe der getline-Funktion umgeschrieben werden, um ganze Zeilen aus dem zu lesen Datei und analysieren Sie dann die Ganzzahlen manuell. Dieser Ansatz vermeidet das EOF-Problem insgesamt:

ifstream iFile("input.txt");

while (getline(iFile, line))
{
    istringstream ss(line);
    int x;
    ss >> x;
    cerr << x << endl;
}

Das obige ist der detaillierte Inhalt vonWarum liest mein C-Code bei der Prüfung auf EOF die letzte Zeile einer Textdatei zweimal?. 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