2016-11-10 7 views
0

Я пытаюсь прочитать двоичный файл 128 Кбайт в кусках по 256 байт. Первые 20-40 байт из 256 байтов кажутся всегда правильными. Однако после этого данные становятся поврежденными. Я попытался прочитать файл и записать его в другой двоичный файл и сравнить. Более половины данных повреждено. Вот мой кодfread() возвращает неверные данные

uint8_t buffer[256] 
read_bin_file = fopen("vtest.bin", "r"); 
if (read_bin_file == NULL) 
{ 
    printf("Unable to open file\n"); 
    return false; 
} 

test_bin = fopen("test_file.bin", "w"); 
if (test_file == NULL) 
{ 
    printf("Unable to open file\n"); 
    return false; 
} 

fflush(stdout); 

for (i = 0; i <=0x1FF; i++) 
{ 
    file_Read_pointer = i * 256; 
    fseek(read_bin_file, file_Read_pointer, SEEK_SET); 
    fread(buffer, 256, 1, read_bin_file); 
    fseek(test_file, file_Read_pointer, SEEK_SET); 
    fwrite(buffer, 256, 1, test_file); 

} 

Что мне не хватает? Также, когда я пытаюсь увеличить количество байтов, считанных с 256 по 1024 (i < 0x7F), ошибка, по-видимому, значительно уменьшается. Файл почти на 90% соответствует

ответ

3

Если это двоичные данные, которые вы читаете и записываете, вам следует открыть файлы в двоичном режиме с помощью read_bin_file = fopen("vtest.bin", "rb");. Обратите внимание на «b» в режиме. Это предотвращает специальную обработку новых символов линии.

Ваши fseek s также не нужны, звонки fread и fwrite будут обрабатывать это для вас. От here «Индикатор положения файла для потока расширен на количество прочитанных символов».

+0

Изменение с "r" на "rb" помогло. Однако есть некоторые байты, которые все еще несовместимы. Причина, по которой я использую Fseek, - это, возможно, придется читать из случайного местоположения. – user3869908

+0

@ user3869908, если вы хотите начать чтение в случайном месте, достаточно одного 'fseek', прежде чем начинать цикл чтения. –

+0

@ user3869908 fread возвращает size_t, чтобы сказать, сколько он прочитал, это должно соответствовать тому, что вы просите, если данные должны быть прочитаны, но не может, если произошла ошибка, то же самое с fwrite. Стоит проверить эти значения, чтобы все произошло так, как ожидалось. –