Обнаружение EOF в C ++ из файла, перенаправленного в STDIN - PullRequest
2 голосов
/ 28 ноября 2010

Выполнение команды:

./program < input.txt

со следующей проверкой кода:

string input;
while(cin) {
  getline(cin, input);
}

Приведенный выше код генерирует дополнительный вызов getline(), когда ввод пуст. Это происходит независимо от того, есть или нет \n в последней строке input.txt.

Ответы [ 3 ]

7 голосов
/ 28 ноября 2010

@ У Джейкоба было правильное решение, но он почему-то удалил свой ответ.Вот что происходит в вашем цикле:

  1. cin проверяется на наличие любых битов сбоя (BADBIT, FAILBIT)
  2. cin не сообщает о проблемах, поскольку ничего еще не былочтение из файла.
  3. getline вызывается, который обнаруживает конец файла, устанавливает бит EOF и FAILBIT.
  4. Цикл повторяется снова с 1, за исключением этого времени.

Вам нужно сделать что-то вроде этого:

std::string input;
while(std::getline(std::cin, input))
{
     //Have your way with the input.
}
3 голосов
/ 28 ноября 2010

Как насчет этого:

string input;
while(getline(cin, input)) {
  //do something with input...
}
1 голос
/ 28 ноября 2010

РЕДАКТИРОВАТЬ: обратите внимание, в приведенном ниже примере я покажу вам, "как обнаружить EOF". Как указал @Billy, вы, вероятно, захотите использовать good() вместо eof() для обнаружения любого условия ошибки или eof. Я включил информацию об этом в конце своего ответа, но это важно, поэтому я добавляю эту заметку вверху, чтобы она была понятной.

(оригинальный ответ следует)


Вы хотите это:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}

с использованием operator! на iostream проверяет только, произошел ли сбой или другое состояние ошибки. ИОС :: оператор! () .

Вы можете использовать good() вместо !eof() для проверки любого из условий eof, badbit или failbit. ИОС :: хорошо () .

...