【问题标题】:Why am I not getting the expected results with fread() in C?为什么我在 C 中使用 fread() 没有得到预期的结果?
【发布时间】:2010-04-05 22:29:12
【问题描述】:

这是我的代码:

#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

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

【问题讨论】:

  • 使用 'bytes' 而不是 '&bytes'。

标签: c binary hex fread


【解决方案1】:

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

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

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

【讨论】:

  • 可能还想检查是否实际读取了完整的 512 个字节(如果文件短于 512 个字节,可能不想尝试输出超出实际长度的任何内容)。
  • 啊,太好了,现在数据比预期的要多一点 bytes[0]: 55 bytes[1]: ffffffaa bytes[2]: 55 bytes[3]: ffffffaa bytes[4]: 60字节[5]:0 字节[6]:0 字节[7]:0 字节[8]:17 字节[9]:a 字节[10]:0 字节[11]:0 非常感谢您的解释。
【解决方案2】:

RichieHindle has already solved the major part of the problem,现在我想帮助处理次要部分。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      几个cmets:

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 2015-04-29
        相关资源
        最近更新 更多