Es muy, muy raro que desee comprobar mal, eof y bueno. En particular para eof (como! Stream.eof() es un error común), la corriente que está actualmente en EOF no necesariamente significa que la última operación de entrada falló; por el contrario, no estar en EOF no significa que la última entrada fue exitosa.
Todas las funciones de estado de la secuencia (fail, bad, eof y good) le informan el estado actual de la transmisión en lugar de predecir el éxito de una operación futura. Comprobar el flujo en sí (que es equivalente a una comprobación invertida fallar) después de la operación deseada:
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);
Para leer y procesar todas las líneas:
for (std::string line; getline(stream, line);) {
process(line);
}
Pointedly, buena() es mal llamada y no es equivalente a probar la transmisión en sí (que hacen los ejemplos anteriores).
¿Cómo es esto un duplicado? La otra respuesta ni siquiera menciona el bucle con la función good() como prueba. –