Heim >Backend-Entwicklung >C++ >Wie teste ich das Dateiende beim Lesen aus einem Dateistream in C korrekt?
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!