为什么我没有用C中的fread()得到预期的结果?

时间:2010-04-05 22:29:12

标签: c binary hex fread

这是我的代码:

#include <stdio.h>

int main(void) {

        FILE *fp;
        unsigned int i;
        char bytes[512];
        fp = fopen("myFile","r");
        for(i = 0;i <= 512;i++) {
                fread(&bytes, sizeof(bytes), 1, fp);
                printf("bytes[%d]: %x\n", i, bytes[i]);
        }
}

这是预期的输出

$ hexdump myFile
0000000 aa55 aa55 0060 0000 0a17 0000 b1a5 a2ea
0000010 0000 0000 614c 7563 616e 0000 0000 0000
0000020 0000 0000 0a68 0000 1001 421e 0000 0000
0000030 f6a0 487d ffff ffff 0040 0000 002f 0000

但这是我从我的程序中看到的

bytes[0]: 55
bytes[1]: 8
bytes[2]: ffffffc8
bytes[3]: ffffffdd
bytes[4]: 22
bytes[5]: ffffffc8
bytes[6]: ffffff91
bytes[7]: 63
bytes[8]: ffffff82

我明显的猜测是,我要么正确地处理错误的内容并收回错误的数据,要么我打印错误并以错误的方式查看。

4 个答案:

答案 0 :(得分:3)

每次循环时,您都会从文件中读取连续的512字节块,并且只打印每个块的一个字节。您可能希望一次读取这512个字节,然后再打印它们,如下所示:

fread(&bytes, sizeof(bytes), 1, fp);
for(i = 0;i < 512;i++) {
    printf("bytes[%d]: %x\n", i, bytes[i]);
}

(另外:一些错误检查不会出错,正如Dav指出的那样,你应该检查你是否真的从文件中读取了预期的字节数。)

答案 1 :(得分:3)

RichieHindle has already solved the major part of the problem,现在我想帮助这个小部分。

当您打印结果时,您的char正在扩展到int秒。对于正数,这无关紧要,但对于负数(任何&gt; = 0x80),您会在开头插入一堆符号位。这很容易解决:

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 

答案 2 :(得分:1)

补充说明。循环中有一个一个一个错误,你正在打印513个元素。

答案 3 :(得分:0)

几点意见:

1)你已经执行了512次循环并且每次读取512个字节。如果你想在循环中读取它,将fread移出循环并一次读取它或更改参数2以fread到sizeof int。

2)您没有检查实际读取的字节数或文件是否成功打开。