2016-11-10 103 views
0

我正在尝试以256字节的块读取128KB二进制文件。 256字节的前20-40个字节似乎总是正确的。但之后,数据被破坏。我试着读取文件并将其写入另一个二进制文件并进行比较。超过一半的数据被破坏。这是我的代码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(我< 0x7F)读取的字节错误似乎显着下降。该文件几乎与90%匹配

回答

3

如果它是您正在读取和写入的二进制数据,则应该使用read_bin_file = fopen("vtest.bin", "rb");以二进制模式打开文件。注意模式中的“b”。这可以防止对新行字符进行特殊处理。

您的fseek也是不必要的,freadfwrite调用将为您处理。 从here“流的文件位置指示符按读取的字符数提前。”

+0

从“r”更改为“rb”帮助。但有一些字节仍然不匹配。我使用Fseek的原因是我可能必须从随机位置读取。 – user3869908

+0

@ user3869908如果您想开始阅读随机位置,在开始读取循环之前单个'fseek'就足够了。 –

+0

@ user3869908 fread返回一个size_t来表示它读取了多少,这应该与您要求的数据是否被读取相匹配,但是如果发生错误则可能不会,与fwrite一样。值得检查这些值以确保一切都按预期发生。 –