C,来自bin文件的fread二进制文件

时间:2012-05-31 22:05:51

标签: c binary fread

我对C很陌生,但我遇到了一个问题...

我的最终目标是从.bin文件中读取(然后printf到控制台)二进制文件,但是现在我一步一步地尝试只读取第一位...

我的代码:

...
FILE *file = fopen("test1.bin", rb);
int i = 0;
fread(&i, 1, 1, file);
printf("%i\n", i);
...

现在我在三个不同的.bin文件上试过这个,一个输出0,另外两个输出12个!

当我从文件中只读取1位时,为什么输出2/12?不应该是0还是1?我究竟做错了什么?非常感谢。

2 个答案:

答案 0 :(得分:6)

fread()来电更改为:

fread(&i, sizeof(int), 1, file);

第二个参数是要读取的元素的大小,第三个参数是要读取的元素的数量。发布的代码正在将单个字节读入int

您还应该检查fopen()fread()来电的返回值,以确保它们成功。

答案 1 :(得分:1)

像@hmjd所说,你应该读取填充int值所需的字节数。所以要么这样:

len = fread(&i, sizeof(int), 1, file);

或者这样:

len = fread(&i, 1, sizeof(int), file);

第一种情况是读取一个int值(通常为4个字节)。通话结束后,如果读取成功,len应等于1。

第二种情况将多个字节读入int值。不同之处在于,此次调用后,len应等于sizeof(int)

无论哪种方式都可行,唯一的区别是第一种方式指定读取多字节单个对象(int),而第二种方式指定读入对象的字节数。这是一个微妙的差异,当然,人们会不同意这是最好的。

第二种方法的优点是len确切地告诉您实际读取了多少字节(这可能对调试I / O错误很有用)。第一种方法的优点是它在概念上更简单的成功测试(是否int读取了一次?)。

但无论你怎么做,都应该检查fread()的返回值。