Конец файла маркера / файла сканирования - PullRequest
0 голосов
/ 16 апреля 2011

У меня проблемы с проверкой файлов, и являются ли эти 2 выражения эквивалентными друг другу в том, как они работают?

#include <stdio.h>
FILE *point;
int number

 while ( fscanf(point, "%d", &number) != -1)

 while ( !feof(point) )

(тестовый файл):

39203 Тао Нгуен

92039 Стивен Гонсалес

По некоторым причинам первое утверждение работает для меня, но второеоператор только дает мне ошибки сегмента, потому что он продолжает читать файл, когда нет места для чтения.

Я попробовал третий способ

 while ( point != EOF) // but this gives me a error of integer to pointer error 

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

Нет, эти два не совпадают:

while ( fscanf(point, "%d", &number) != -1)
while ( !feof(point) )

fscanf может вернуть EOF (который вы должны использовать вместо -1) по нескольким причинам:

Если вход заканчивается до первого неудачного совпадения или преобразования, EOF должен быть возвращен.Если возникает какая-либо ошибка, EOF должен быть возвращен, и errno должен быть установлен для указания ошибки.

Но feof:

Функция feof () должна возвращать ненулевое значение тогда и только тогда, когда для конца потока установлен индикатор конца файла.

1 голос
/ 16 апреля 2011

EOF - это константа, определенная в stdio.h обычно как -1. Вот почему первый случай работает на вас. Тем не менее, это плохая практика - использовать литерал -1, поскольку реализация теоретически может определять EOF, как ему хочется. Таким образом, вы действительно хотите сделать что-то вроде while ( fscanf(point, "%d", &number) != EOF )

См. Справочную страницу fscanf:

http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html

0 голосов
/ 16 апреля 2011

первое утверждение:

while ( fscanf(point, "%d", &number) != -1)

в конечном итоге будет использовать содержимое вашего файла (когда fscanf возвращает -1 в большинстве случаев, что является EOF), в то время как:

while ( !feof(point) )

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

while ( point != EOF)

выдаст вам ошибку, так как точка - это указатель на структуру FILE, а EOF - это int (поскольку EOF определяется в большинстве случаев)

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