Подтвердить что ты не робот

Eof() плохая практика?

Возможный дубликат:
Почему iostream:: eof внутри условия цикла считается неправильным?

Итак, я использовал функцию eof() во многих своих программах, требующих ввода файлов, и мой профессор сказал, что это нормально, но несколько человек на SO заявили, что я не должен использовать его без указания причины. Поэтому мне было интересно, есть ли веская причина?

4b9b3361

Ответ 1

Вы можете использовать eof для проверки точного состояния, которое он сообщает, - попытались ли вы прочитать прошлый конец файла. Вы не можете использовать его, чтобы проверить, есть ли больше ввода для чтения, или если чтение выполнено успешно, что является более распространенным тестом.

Неправильно:

while (!cin.eof()) {
  cin >> foo;
}

Правильно:

if (!(cin >> foo)) {
  if (cin.eof()) {
    cout << "read failed due to EOF\n";
  } else {
    cout << "read failed due to something other than EOF\n";
  }
}

Ответ 2

Вы не должны использовать его, потому что если сбой ввода по другой причине, вы можете быть ввернуты.

while(!file.eof()) {
    int i;
    file >> i;
    doSomething(i);
}

Что происходит в вышеприведенном цикле, если содержимое файла "WHAARRRRRRGARBL"? Он бесконечно петлит, потому что это не конец файла, но вы все равно не можете извлечь из него int.

Ответ 3

Как вы его используете? Что .eof() скажет вам, что поток уже попал в конец файла, что он попытался прочитать данные, которых там нет.

Это обычно не то, что вы хотите. Обычно вы хотите знать, что вы попадаете в конец файла, или что вы собираетесь поразить конец файла, а не то, что вы уже его ударили. В виде цикла:

while(!f.eof())
{
    f >> /* something */;
    /* do stuff */
}

вы попытаетесь прочитать ввод и выйти из строя, а затем вы выполните все в /* do stuff */, а затем условие цикла завершится неудачно и цикл остановится.

Другая проблема с этим циклом заключается в том, что другие способы ввода могут быть неудачными. Если в файле, который не является EOF, есть условие ошибки, .fail() вернет true, но .eof() не будет.

Ответ 4

Если приведенные выше ответы путают:

То, что думают люди, ошибочно:

  • eof() не смотрит, просматривает ли последняя прочитанная часть последний байт файла.
  • Он не смотрит, будет ли следующий байт после конца файла.

Что он на самом деле делает:

  • eof() сообщает, прошло ли последнее чтение байтов, находящихся за концом файла.

Если eof() истинно, вы уже допустили ошибку. Таким образом, объясняется выражение профессоров. Используйте его для чего-то, произошла ошибка.