fread()返回不正确的数据
问题描述:
我正在尝试以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%匹配
答
如果它是您正在读取和写入的二进制数据,则应该使用read_bin_file = fopen("vtest.bin", "rb");
以二进制模式打开文件。注意模式中的“b”。这可以防止对新行字符进行特殊处理。
您的fseek
也是不必要的,fread
和fwrite
调用将为您处理。 从here“流的文件位置指示符按读取的字符数提前。”
从“r”更改为“rb”帮助。但有一些字节仍然不匹配。我使用Fseek的原因是我可能必须从随机位置读取。 – user3869908
@ user3869908如果您想开始阅读随机位置,在开始读取循环之前单个'fseek'就足够了。 –
@ user3869908 fread返回一个size_t来表示它读取了多少,这应该与您要求的数据是否被读取相匹配,但是如果发生错误则可能不会,与fwrite一样。值得检查这些值以确保一切都按预期发生。 –