feof () возвращает true, когда EOF не достигнут - PullRequest
2 голосов
/ 14 декабря 2010

Я пытаюсь прочитать файл с определенным смещением (упрощенная версия):

typedef unsigned char u8;
FILE *data_fp = fopen("C:\\some_file.dat", "r");
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset
u8 *data = new u8[0x3F0];
fread(data, 0x3F0, 1, data_fp);
delete[] data;
fclose(data_fp);

Проблема заключается в том, что данные будут содержать не 1008 байтов, а 529 (кажется случайным).Когда он достигает 529 байт, вызовы feof (data_fp) начнут возвращать true.

Я также пытался читать небольшими порциями (по 8 байт за раз), но похоже, что он достигает EOF, когдаеще нет.

Простой просмотр в шестнадцатеричном редакторе показывает осталось много байтов .

Ответы [ 4 ]

4 голосов
/ 14 декабря 2010

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

Откройте файл в двоичном режиме, передав опцию "b" вызову fopen

fopen(filename, "rb");
1 голос
/ 14 декабря 2010

Может быть, это разница между текстовым и двоичным файлом. Если вы работаете в Windows, символом новой строки является CRLF, который состоит из двух символов в файле, но при чтении преобразуется в один. Попробуйте использовать fopen (..., "rb")

1 голос
/ 14 декабря 2010

Параллельно файл записывается другим приложением? Возможно, существует условие состязания, поэтому файл заканчивается там, где останавливается чтение, когда выполняется чтение, но позже, когда вы проверяете его, остальное было записано. Это тоже объясняет случайность.

0 голосов
/ 14 декабря 2010

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

Кроме того, вам лучше использовать ввод / вывод 2-го уровня, вызовы f - древнее уродствои вы используете C ++, поскольку у вас есть новый.

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";

Теперь выполняйте поиск и чтение, используя вызовы ввода-вывода уровня 2, которые в любом случае быстрее, и давайте посмотрим, какой размер файла действительно есть.

...