Stream-Bedingung testen: Warum die Verwendung von good() oder !eof() die letzte Zeile zweimal liest
Beim Versuch, eine Textdatei zu lesen Zeile für Zeile mit ifstream, kann die Verwendung von f.good() oder !f.eof() innerhalb einer Schleife dazu führen, dass die letzte Zeile zweimal gelesen wird. Lassen Sie uns den Grund für dieses Verhalten untersuchen und alternative Lösungen erkunden.
Stream-Statusfunktionen verstehen
good(), eof() und fail() sind Stream-Status Funktionen, die den aktuellen Status des Eingabestreams anzeigen. Sie sagen jedoch nicht den Erfolg oder Misserfolg zukünftiger Eingabevorgänge voraus.
Grund für das zweimalige Lesen der letzten Zeile
Das Problem tritt auf, weil good() und eof( ) spiegeln nicht unbedingt das Ergebnis des letzten Eingabevorgangs wider. Beispielsweise garantiert !f.eof() nicht, dass das vorherige getline() erfolgreich war. Umgekehrt bedeutet das Nichtbestehen bei EOF nicht, dass der letzte Eingabevorgang fehlgeschlagen ist.
Alternative Lösung: Überprüfen des Stream-Status nach dem Eingabevorgang
Um Zeilen korrekt zu lesen und zu verarbeiten, Es ist wichtig, den Stream-Status nach der Eingabeoperation zu überprüfen:
if (getline(f, line)) { // Use line here } else { // Handle error or end of file }
Alternative Lösung: Iterieren mit Schleife
Eine weitere elegante Lösung ist die Verwendung einer Schleife, die iteriert, bis getline() fehlschlägt:
for (string line; getline(f, line);) { // Use line here }
Vermeidung falsch benannter good()-Funktion
Abschließend ist es wichtig zu beachten, dass „good()“ eine Fehlbezeichnung ist und nicht mit dem Testen des Streams selbst gleichzusetzen ist. Es wird empfohlen, die oben beschriebenen Techniken zu verwenden, anstatt sich auf good() zu verlassen.
Das obige ist der detaillierte Inhalt vonWarum liest die Verwendung von „good()' oder „!eof()' die letzte Zeile einer Datei zweimal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!