test speed pruebas prueba hacer directo como c++ iostream

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).