проверка на eof в строке :: getline - PullRequest
37 голосов
/ 12 февраля 2010

Как проверить конец файла с помощью функции std::getline? Если я использую eof(), он не выдаст сигнал eof, пока я не попытаюсь прочитать за пределами конца файла.

Ответы [ 2 ]

51 голосов
/ 12 февраля 2010

Канонический цикл чтения в C ++:

while (getline(cin, str)) {

}

if (cin.bad()) {
    // IO error
} else if (!cin.eof()) {
    // format error (not possible with getline but possible with operator>>)
} else {
    // format error (not possible with getline but possible with operator>>)
    // or end of file (can't make the difference)
}
12 голосов
/ 12 февраля 2010

Просто прочитайте, а затем проверьте, что операция чтения прошла успешно:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     std::cout << "failure\n";
 }

Поскольку сбой может быть вызван рядом причин, вы можете использовать функцию-член eof, чтобы увидеть, что на самом деле произошло EOF:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     if(std::cin.eof())
         std::cout << "EOF\n";
     else
         std::cout << "other failure\n";
 }

getline возвращает поток, чтобы вы могли писать более компактно:

 if(!std::getline(std::cin, str))
...