C ++ - Programmierer bemerken jedoch, dass cin.eof () immer "true" zurückgibt, bis die letzte Zeile zweimal gelesen wurde.
Das ist nicht was passiert. Das eofbit
spielt bei der Konvertierung in einen Booleschen Wert ( stream::operator bool
(oder operator void*
in älterem c ++)) keine Rolle . Nur die badbit
und failbit
sind beteiligt.
Angenommen, Sie lesen eine Datei mit durch Leerzeichen getrennten Zahlen. Eine Schleife, die auf basiert, cin.eof()
ist unweigerlich entweder falsch oder voller if
Tests. Sie lesen erst EOF. Sie lesen Zahlen. Lassen Sie Ihren Code diese Logik ausdrücken:
while (stream >> some_var) {
process_value(some_var);
}
Dies funktioniert unabhängig davon, ob die letzte Zeile der Datei mit 0 42\n
oder nur endet 0 42
(keine neue Zeile am Ende der letzten Zeile in der Datei). Wenn die Datei mit endet 0 42\n
, ruft der letzte gute Lesevorgang den Wert 42 ab und liest den letzten Zeilenende-Marker. Beachten Sie, dass der EOF-Marker noch nicht gelesen wurde. Die Funktion process_value
wird mit aufgerufen 42
. Der nächste Aufruf zum Stream-Operator >> liest den EOF, und da nichts extrahiert wurde, sowohl das eofbit
und failbit
wird eingestellt.
Angenommen, die Datei endet mit 0 42
(keine neue Zeile am Ende der letzten Zeile). Der letzte gute Lesevorgang ruft den Wert 42 ab, der auf dem EOF-Marker endet. Vermutlich möchten Sie diese 42 verarbeiten. Aus diesem Grund eofbit
spielt das im booleschen Konvertierungsoperator des Eingabestreams keine Rolle. Beim nächsten Aufruf an den Stream-Extraktionsoperator >> erkennt die zugrunde liegende Maschine schnell, dass der eofbit
bereits eingestellt ist. Dies führt schnell zum Einstellen der failbit
.
Warum funktioniert der erste Code immer nicht richtig?
Weil Sie nicht nach EOF als Schleifenbedingung suchen sollten. Die Schleifenbedingung sollte ausdrücken, was Sie versuchen, z. B. Zahlen aus einem Stream zu extrahieren.