Heim >Backend-Entwicklung >C++ >Warum liest mein C-Code bei der Prüfung auf EOF die letzte Zeile einer Textdatei zweimal?
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!