помощью fgets читать построчно в файлах

Я понимаю, что fgets читает до EOF или новой строки.

Я написал пример кода для чтения строк из файла, и я заметил, что fgets выполняется больше, чем желаемое количество раз. Это очень простой файл с двумя пустыми строками, т. е. Я нажал enter один раз и сохранил файл.

ниже код:

fp = fopen("sample.txt","r");
while (!feof(fp)) {
        fgets(line,150,fp);
        i++;
        printf("%s",line);
}
printf("%d",i);

почему цикл while выполняется три раза вместо 2, так как в файле есть только две пустые строки?

1 ответов


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

обычно лучше не использовать feof вообще и проверьте возвращаемые значения из f... семейство функций:

fp = fopen("sample.txt", "r");
while (1) {
        if (fgets(line,150, fp) == NULL) break;
        i++;
        printf("%3d: %s", i, line);
}
printf("%d\n",i);

функции feof возвращает true после попытки прочитать дальше конец файла, который происходит только после вашего последнего (неудачного) вызова fgets, который пытается прочитать at или, скорее, перед самым концом файла. Ответы в этом долго так пост подробнее объяснить.