Heim >Backend-Entwicklung >C++ >Wie teste ich das Dateiende beim Lesen aus einem Dateistream in C korrekt?

Wie teste ich das Dateiende beim Lesen aus einem Dateistream in C korrekt?

Linda Hamilton
Linda HamiltonOriginal
2024-12-21 15:33:10687Durchsuche

How to Correctly Test for End-of-File When Reading from a File Stream in C  ?

Testen des Stream-Eingabestatus im Vergleich zum zukünftigen Erfolg

Beim Lesen von Eingaben mithilfe von Streams ist es wichtig, den Unterschied zwischen dem Testen des Stream-Status und dem Vorhersagen zu verstehen der Erfolg zukünftiger Operationen.

Problem: Letzte Zeile lesen Zweimal

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

In diesem Code wird die letzte Zeile zweimal gelesen, da f.good() den aktuellen Stream-Status testet und nicht, ob getline() erfolgreich sein wird. Sobald getline() den EOF erreicht, bleibt f in einem „guten“ Zustand, sodass die Schleife auch nach dem Lesen der letzten Zeile fortgesetzt wird.

Lösung: Stream nach dem Vorgang testen

Überprüfen Sie stattdessen den Stream-Status, nachdem Sie den Eingabevorgang ausgeführt haben:

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

Alternative Verwendung eof()

Während die Verwendung von eof() in Schleifenbedingungen nicht empfohlen wird, finden Sie hier eine äquivalente Lösung mit !f.eof():

ifstream f("x.txt");
string line;
while (!f.eof()) {
  if (getline(f, line)) {
    // Use line here.
  } else {
    break;
  }
}

Range -basierte Schleife für alle Zeilen

Um alle Zeilen zu lesen und zu verarbeiten, verwenden Sie eine bereichsbasierte Schleife Schleife:

ifstream f("x.txt");
for (std::string line; getline(f, line);) {
  process(line);
}

Good vs. Stream State

Beachten Sie, dass f.good() falsch benannt ist. Es zeigt nicht wirklich an, ob der Stream „gut“ ist, sondern gibt eher „true“ zurück, wenn sich der Stream nicht in einem „fehlgeschlagenen“ oder „schlechten“ Zustand befindet. Testen Sie immer den Stream selbst (d. h. überprüfen Sie seinen invertierten Fehlerstatus), nachdem Sie Eingabevorgänge ausgeführt haben, um den Erfolg sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie teste ich das Dateiende beim Lesen aus einem Dateistream in C korrekt?. 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