Kurze Antwort: Mit good() bist du auf der sicheren seite, da diese Funktion auch auf das Ende Der Datei (EOF) prüft. !Input tut das hingegen nicht.
Lange Antwort (Begründung / Hintergründe / Beweis):
Wenn du dir die Definition von std::ios_base::good() anschaust, wie sie DeKugelschreiber schon genannt hat:
|
C-/C++-Quelltext
|
1
2
3
4
|
bool __CLR_OR_THIS_CALL good() const
{ // test if no state bits are set
return (rdstate() == goodbit);
}
|
und diese vergleichst mit std::ios_base::fail(), wie sie in std::ios_base::operator!() verwendet wird:
|
C-/C++-Quelltext
|
1
2
3
4
|
bool __CLR_OR_THIS_CALL fail() const
{ // test if badbit or failbit is set in stream state
return (((int)rdstate() & ((int)badbit | (int)failbit)) != 0);
}
|
... siehst du, dass der Unterschied zwischen Verwendung des !-operators, bzw. der Funktion good() nur ein anderer Bitvergleich ist.
fail gibt true zurück, wenn in den Statusbytes das 2te (failbit) und 3te (badbit) Bit nicht gesetzt ist. good() gibt true zurück, wenn kein Bit gesetzt ist (goodbit = 0x0)
dazu gibt es noch das erste bit, welches einen EOF-Fehler indiziert. Sollte also das Ende der Datei bereits beim Laden erreicht sein, wird fail() true zurückgeben und good() false.
Edit: Für extrem "harte" fehler, wird noch das 5te Bit gesetzt (0x10). Auch das wird von fail(), also dem !-operator nicht geprüft. Dennoch wird das meines Wissens auch nie gesetzt