Sie wollen sehr, sehr selten schlecht, eof, und gut prüfen. Insbesondere für eof (da! Stream.eof() ein häufiger Fehler ist) bedeutet der Strom, der gerade bei EOF ist, nicht notwendigerweise, dass die letzte Eingabeoperation fehlgeschlagen ist; Umgekehrt heißt das nicht, dass die letzte Eingabe nicht erfolgreich war.
Alle Stream-Statusfunktionen - fail, bad, eof und good - informieren Sie über den aktuellen Status des Streams und nicht über den Erfolg einer zukünftigen Operation. Überprüfen Sie den Strom selbst (die mit einem invertierten Störungskontrolle äquivalent ist), nachdem die gewünschte Operation:
if (getline(stream, line)) {
use(line);
}
else {
handle_error();
}
if (stream >> foo >> bar) {
use(foo, bar);
}
else {
handle_error();
}
if (!(stream >> foo)) { // operator! is overloaded for streams
throw SomeException();
}
use(foo);
zu lesen und verarbeiten alle Linien:
for (std::string line; getline(stream, line);) {
process(line);
}
Pointedly, gut() misnamed ist und nicht entspricht dem Testen des Streams selbst (was die obigen Beispiele tun).
Wie ist das ein Duplikat? Die andere Antwort erwähnt nicht einmal das Schleifen mit der Funktion good() als Test. –