По логике, после EOF (конец файла) нет данных.
Отметьте, что EOF
не является символом; это специальное значение, возвращаемое getc()
после того, как было обнаружено условие конца файла или ошибки, а значение вместо - значение символа.
Вы не сказали об этом в вопросе, но я предполагаю, что у вас есть текстовый файл Windows с одним или несколькими встроенными символами Ctrl-Z(). Это единственное, о чем я могу думать, это соответствует вашему описанию.
В Windows символ Ctrl-Z в текстовом файле рассматривается как конец файла. (Это относится к более ранним системам, где конец данных не был четко отмечен, поскольку в файловой системе записано только количество блоков.) Ctrl-Z не является символом EOF; это значение символа, которое в Windows вызывает триггеры и состояние конца файла и вызывает getc()
для возврата EOF
.
В основном у вас есть искаженный текстовый файл, и вы должны, вероятно, просто исправить его и/или исправить все, что сгенерировано. Но если вам действительно нужно прочитать данные из него, я предлагаю открыть его в двоичном режиме, а не в текстовом режиме. Затем вы увидите каждый маркер конца CR/LF как два символа ('\r'
, '\n'
, а не только '\n'
), а Ctrl-Z (0x1a
) - это еще одно значение байта. Поскольку вы не рассматриваете файл как текст («текст» заканчивается первым Ctrl-Z), имеет смысл читать его в двоичном режиме.
Есть, вероятно, трюки, которые вы можете сыграть, чтобы прочитать текст Ctrl-Z в текстовом режиме; например, clearerr()
может работать. Но это выходит за рамки того, что гарантирует стандарт C, что может или не может быть проблемой для вас.
Кроме того, вы должны обязательно использовать символ EOF
, не на «магическое число» -1
. Даже не гарантировано, что EOF == -1
, а с помощью символа EOF
значительно улучшит ваш код.
Наконец, спасибо Марку Плотнику за то, что он заметил в комментарии что-то, что я должен был заметить сам. getc()
возвращает результат int
; вы назначаете его объекту char
. x
Должно быть типа int
, а не char
. Это необходимо, чтобы вы могли различать значение EOF
и значение любого действительного символа.
Вы имеете в виду, что вы читаете файл, который в то же время записывается? – Vasfed
Код должен иметь больше смысла. Я читаю файл с EOF до его реального окончания или, что еще хуже, может иметь несколько EOF. – user3574984
Вы можете вызвать [clearerr] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/clearerr.html), чтобы система stdio временно забыла о состоянии EOF. Но в вашем случае это не проблема. Ваш код может интерпретировать символы '\ 377' как -1. Объявите 'x' как' int', а не 'char'. Это то, что 'getc' определено для возврата. –