1

我对 C 很陌生,但我遇到了 fread 的问题......

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

我的代码:

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

现在我已经在三个不同的 .bin 文件上进行了尝试,一个输出 0,另一个输出 2,另一个输出 12!

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

4

2 回答 2

7

将调用更改fread()为:

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

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

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

于 2012-05-31T22:09:32.470 回答
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)

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

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

但无论你怎么做,你都应该经常检查fread().

于 2012-05-31T22:28:31.583 回答