我对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?我究竟做错了什么?非常感谢。
答案 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()
的返回值。