Además de James' answer, es importante recordar que estos indicadores indican resultados de operaciones, por lo que no se establecerán a menos que realice uno.
Un error común es hacer esto:
#include <fstream>
#include <iostream>
#include <string>
int main()
{
std::ifstream file("main.cpp");
while (!file.eof()) // while the file isn't at eof...
{
std::string line;
std::getline(file, line); // ...read a line...
std::cout << "> " << line << std::endl; // and print it
}
}
El problema aquí es que eof()
no se establecerá hasta después tratamos de obtener la última línea, momento en el que la corriente va a decir " ¡No, no más! " y establecerlo. Esto significa que la forma "correcta" es:
#include <fstream>
#include <iostream>
#include <string>
int main()
{
std::ifstream file("main.cpp");
for (;;)
{
std::string line;
std::getline(file, line); // read a line...
if (file.eof()) // ...and check if it we were at eof
break;
std::cout << "> " << line << std::endl;
}
}
Esto coloca el cheque en la ubicación correcta. Esto es muy rebelde sin embargo; afortunadamente para nosotros, el valor de retorno para std::getline
es la secuencia, y la secuencia tiene un operador de conversión que permite que se pruebe en un contexto booleano, con el valor de fail()
, que incluye eof()
. Entonces podemos simplemente escribir:
#include <fstream>
#include <iostream>
#include <string>
int main()
{
std::ifstream file("main.cpp");
std::string line;
while (std::getline(file, line)) // get line, test if it was eof
std::cout << "> " << line << std::endl;
}
Bueno es mal llamado (y por lo tanto mal aplicado), porque la prueba de bueno() no le dice si la última operación tuvo éxito o no. En otras palabras, stream.good() no es equivalente a bool (stream). –