1

这是我的代码:

#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

4 回答 4

3

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

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

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

于 2010-04-05T22:33:27.197 回答
3

RichieHindle已经解决了大部分问题,现在我想帮助解决次要部分。

当您打印结果时,您char的 s 被扩展为ints。对于正数,这无关紧要,但对于负数(任何 >= 0x80),您会在开头插入一堆符号位。很容易修复:

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 
于 2010-04-05T22:44:57.383 回答
1

附加说明。循环中有一个错误,您正在打印 513 个元素。

于 2010-04-05T22:54:40.603 回答
0

几个评论:

1)您在循环中执行了 512 次 fread ,每次读取 512 个字节。将 fread 移出循环并一次性读取,或者如果您想在循环中读取它,请将参数 2 更改为 sizeof int。

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

于 2010-04-05T22:43:28.277 回答