feof
не возвращает значение true до тех пор, пока вы не попытаетесь прочитать конец файла. Представьте себе файл, подобный следующему:
This is a test$
^
где ^
указывает текущее местоположение в файле, а $
представляет конец файла. После первого вызова fscanf(fin, "%s", letta);
поток выглядит так:
This is a test$
^
После трех итераций цикла (чтение «is», «a» и «test») у вас есть это:
This is a test$
^
В этот момент feof(fin)
по-прежнему возвращает false
, потому что в этот момент все, что вы знаете, это то, что вы достигли конца строки «тест». Таким образом, ваш цикл будет выполнен еще раз. Поскольку вы находитесь в конце файла, читать нечего, поэтому содержимое letta
не будет изменено, так что это будет выглядеть так, как будто вы прочитали слово «тест» дважды. Теперь feof(fin)
возвращает значение true.
Мораль этой истории в том, что вы не должны использовать feof
в качестве условия цикла; скорее, вы должны использовать результат самой операции чтения, например:
errno = 0;
while (fscanf(fin, "%s", letta) == 1)
{
// process letta
}
if (feof(fin))
{
printf("Reached end of file\n");
}
else
{
perror("Error on read");
}
person
John Bode
schedule
20.06.2012
feof
: stackoverflow.com/questions/5431941/ - person William Pursell   schedule 30.01.2013