En plus de James' answer, il est important de se rappeler que ces drapeaux indiquent résultats des opérations, donc ne seront pas réglées, sauf si vous effectuez l'une.
Une erreur commune est de faire ceci:
#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
}
}
Le problème ici est que eof()
ne sera pas réglé avant après nous essayons d'obtenir la dernière ligne, à quel point le flux dira " non, pas plus! et définissez-le. Cela signifie que la "bonne" façon est la suivante:
#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;
}
}
Ceci place la vérification à l'emplacement correct. C'est très indiscipliné cependant; heureusement pour nous, la valeur de retour pour std::getline
est le flux, et le flux a un opérateur de conversion qui lui permet d'être testé dans un contexte booléen, avec la valeur de fail()
, qui comprend eof()
. Nous pouvons donc écrire:
#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;
}
Bon est mal nommé (et donc mal appliqué), car tester good() ne vous dit pas si la dernière opération a réussi ou non. En d'autres termes, stream.good() n'est pas équivalent à bool (stream). –