Heim >Backend-Entwicklung >C++ >Wie kann ich das doppelte Lesen von Zeilen vermeiden, wenn ich C-Datei-Eingabestreams verwende?

Wie kann ich das doppelte Lesen von Zeilen vermeiden, wenn ich C-Datei-Eingabestreams verwende?

Barbara Streisand
Barbara StreisandOriginal
2024-12-15 13:28:16233Durchsuche

How Can I Avoid Double-Reading Lines When Using C   File Input Streams?

Stream-Status für Dateieingabe testen: Doppelte Lesevorgänge vermeiden

Beim Lesen von Daten aus einer Datei ist es wichtig, das mehrfache Lesen derselben Zeile zu vermeiden mal. Allerdings kann die Überprüfung von Stream-Zuständen wie good() oder !eof() vor dem Lesen zu unerwartetem Verhalten führen.

Beachten Sie den folgenden Code:

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}

Dieser Code soll alle Zeilen lesen von der Datei bis zum Ende. Die letzte Zeile wird jedoch zweimal gelesen. Um zu verstehen, warum, müssen wir uns mit den Interna von Stream State Flags befassen.

Stream State Flags

good(), eof(), fail() und bad() sind Stream-Statusflags, die den aktuellen Status eines Eingabestreams anzeigen. Normalerweise wird erwartet, dass das Flag „good()“ anzeigt, ob sich der Stream in einem gültigen Zustand zum weiteren Lesen befindet, aber das ist nicht ganz korrekt. Es wird genauer als das Fehlen von Fehlern oder End-of-File-Bedingungen beschrieben.

Das Problem mit good() und !eof()

Wenn Sie den Stream überprüfen .good() oder !stream.eof() vor dem Lesen verwenden, fragen Sie den Stream nicht, ob der nächste Lesevorgang erfolgreich sein wird. Sie fragen nur den aktuellen Status ab.

Wenn beispielsweise die letzte Zeile aus einer Datei gelesen wird, wird das Flag eof() gesetzt. Das Flag „good()“ könnte jedoch immer noch „true“ sein, was bedeutet, dass beim letzten Lesevorgang kein Fehler aufgetreten ist.

Lösung

Um doppelte Lesevorgänge zu vermeiden, ist der richtige Ansatz: Testen Sie den Stream nach dem Lesevorgang:

// Read all lines from a file
for (std::string line; getline(f, line);) {
  process(line);
}

// Read an integer and store it in foo
int foo;
if (f >> foo) {
  use(foo);
} else {
  handle_error();
}

Dieser Ansatz stellt sicher, dass Sie nur Daten verarbeiten, die erfolgreich aus der Datei gelesen wurden.

Das obige ist der detaillierte Inhalt vonWie kann ich das doppelte Lesen von Zeilen vermeiden, wenn ich C-Datei-Eingabestreams verwende?. 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