Нет `while (! My_ifstream.eof ()) {getline (my_ifstream, line)}` в C ++? - PullRequest
4 голосов
/ 02 октября 2011

На этот сайт , кто-то пишет:

while (! myfile.eof() )
{
   getline (myfile,line);
   cout << line << endl;
}

Это неправильно, внимательно прочитайте документацию по eof () memberfunction. Правильный код такой:

while( getline( myfile, line))
    cout << line << endl;

Почему это?

Ответы [ 2 ]

8 голосов
/ 02 октября 2011

Есть две основные причины.@Etienne указал на одно: чтение может завершиться неудачей по какой-то причине, кроме достижения конца файла, и в этом случае ваша первая версия попадет в бесконечный цикл.

Однако даже без других сбоевСначала не будет работать правильно.eof() не будет установлен до после попытка чтения не удалась, потому что достигнут конец файла.Это означает, что первый цикл выполнит одну дополнительную итерацию, которая вам не нужна.В этом случае это просто добавит дополнительную пустую (пустую) строку в конец файла.В зависимости от того, с чем вы работаете, это может иметь или не иметь значение.В зависимости от того, что вы используете для чтения данных, также довольно часто можно увидеть, как последняя строка повторяется в выводе.

3 голосов
/ 02 октября 2011

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

...