Feof () возвращение версии, когда EOF не достигнут

StackOverflow https://stackoverflow.com/questions/4441342

  •  10-10-2019
  •  | 
  •  

Вопрос

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

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, когда он еще не там.

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

Это было полезно?

Решение

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

Откройте файл в двоичном режиме, передавая опцию «B» в Call Fopen Call

fopen(filename, "rb");

Другие советы

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

Может быть, это разница между текстовым и двоичным файлом. Если вы находитесь в Windows, Newlines - это CRLF, что в файле два символа, но преобразована только в один при чтении. Попробуйте использовать Fopen (..., «RB»)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top