c++ - speed - Prueba stream.good() o! Stream.eof() lee la última línea dos veces
twitch analyzer (3)
Posible duplicado:
¿Por qué iostream :: eof está dentro de una condición de bucle considerada incorrecta?
Tengo el siguiente fragmento de código:
ifstream f("x.txt");
string line;
while (f.good()) {
getline(f, line);
// Use line here.
}
Pero esto dice la última línea dos veces. ¿Por qué sucede esto y cómo lo soluciono?
Algo muy similar sucede con:
ifstream f("x.txt");
string line;
while (!f.eof()) {
getline(f, line);
// Use line here.
}
No leyó la última línea dos veces, pero como no pudo leer cuando llegó a eof, su línea de cadena tiene el valor que tenía anteriormente.
Eso es porque f ya no es "bueno" cuando ha leído EOF, no cuando está a punto de leerlo.
Muy, muy rara vez quiere 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 flujo (falla, mal, eof y bueno) le informan el estado actual de la transmisión en lugar de predecir el éxito de una operación futura. Verifique la transmisión en sí misma (que es equivalente a una prueba de falla invertida) 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);
}
Puntualmente, bueno () tiene un nombre erróneo y no es equivalente a probar la transmisión en sí misma (que los ejemplos anteriores sí).
Solo usa
ifstream f("x.txt");
while (getline(f, line)) {
// whatever
}
Esta es la forma idiomática de escribir tal bucle. No he podido reproducir el error (en una máquina Linux).