2016-06-30 2 views
0

Можно ли прочитать файл после его EOF?Прочитать файл после EOF

Я читаю файл, который может содержать символ EOF перед его окончанием или несколько символов EOF. Файл представляет собой простой txt, и я могу узнать количество символов, используя fsize, но похоже, что getc возвращает EOF (или -1) из EOF в конец файла.

int c = 0; 
char x; 
FILE *file = fopen("MyTextFile.txt", "r"); 
off_t size = fsize("MyTextFile.txt"); 

while (c < size) { 
    x = getc(file); 
    if (x != -1) 
     printf("%c ", x); 
    else 
     printf("\nFOUND EOF!\n"); 
    c++; 
} 
fclose(file); 

К сожалению, даже если я уверен, что содержимое файла продолжается после EOF, я не могу прочитать остальное.

SOLVED: Чтение с использованием «rb» вместо «r» и использование x as int позволило мне прочитать весь файл, включая несколько EOF. Не уверен, что это трюк, или если что-то разрешено, но работает.

+0

Вы имеете в виду, что вы читаете файл, который в то же время записывается? – Vasfed

+0

Код должен иметь больше смысла. Я читаю файл с EOF до его реального окончания или, что еще хуже, может иметь несколько EOF. – user3574984

+4

Вы можете вызвать [clearerr] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/clearerr.html), чтобы система stdio временно забыла о состоянии EOF. Но в вашем случае это не проблема. Ваш код может интерпретировать символы '\ 377' как -1. Объявите 'x' как' int', а не 'char'. Это то, что 'getc' определено для возврата. –

ответ

5

По логике, после 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 и значение любого действительного символа.

0

Ваш код является неполным, так что трудно сказать, в чем проблема, но я хотел бы предложить:

  1. Убедитесь, что вы открываете файл в двоичном режиме «гб»
  2. Убедитесь, что x имеет тип int
0

Chapter and verse:

7,21 входа/выход <stdio.h>

7.21.1 Введение

...
3 Макросов ...

            EOF

, которая расширяется к константному выражению целого числа, с типом int и отрицательным значением, что возвращается несколько функций для указания истекшим файла, то есть не более ввод из потока ;

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

Смежные вопросы