В дополнение к ответу Джеймса важно помнить, что эти флаги указывают результаты операций, поэтому не будут установлены, если вы не выполните одну из них.
Распространенная ошибка заключается в следующем:
#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
}
}
Проблема здесь в том, что eof()
не будет установлен до , после мы попытаемся получить последнюю строку, и в этот моментпоток скажет "Нет, не больше!"и установить его.Это означает, что «правильный» путь:
#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;
}
}
Это помещает чек в правильное место.Это очень неуправляемо, хотя;К счастью для нас, возвращаемое значение для std::getline
является потоком, и поток имеет оператор преобразования, который позволяет его тестировать в логическом контексте со значением fail()
, которое включает в себя eof()
.Таким образом, мы можем просто написать:
#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;
}