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

为什么我在C中使用fread()时没有得到预期的结果?,c,binary,hex,fread,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);

这是我的密码:

#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]);
        }
}
但这是我从节目中看到的

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

我的猜测很明显,要么是寻址错误,接收回的数据错误,要么是打印错误,查看方式错误。

您每次循环都从文件中连续读取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字节,然后再打印,如下所示:

fread(&bytes, sizeof(bytes), 1, fp);
for(i = 0;i < 512;i++) {
    printf("bytes[%d]: %x\n", i, bytes[i]);
}
另外:一些错误检查不会出错,正如Dav指出的,您应该检查是否确实从文件中读取了预期的字节数。

两条注释:

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

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

两条注释:

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

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

RichieHindle,现在我想帮助您完成小部分

打印结果时,您的字符将扩展到int。对于正数,这并不重要,但是对于负数,任何>=0x80,都会在开头插入一组符号位。很容易修复:

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 
RichieHindle,现在我想帮你做小部分

打印结果时,您的字符将扩展到int。对于正数,这并不重要,但是对于负数,任何>=0x80,都会在开头插入一组符号位。很容易修复:

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

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

附加说明。循环中出现了一个off by one错误,您正在打印513个元素。

如果文件短于512 byes,可能还想检查是否实际读取了完整的512字节,可能不想尝试输出超出实际长度的任何内容。啊,太好了,现在数据比预期的字节[0]:55字节[1]多一点:ffffff aa bytes[2]:55 bytes[3]:ffffff aa bytes[4]:60 bytes[5]:0 bytes[6]:0 bytes[7]:0 bytes[8]:17 bytes[9]:a bytes[10]:0 bytes[11]:0非常感谢您的解释。如果文件短于512 byes,可能还想检查是否实际读取了完整的512字节,可能不想尝试输出超出实际长度的任何内容。啊,太好了,现在数据比预期的多了一点字节[0]:55字节[1]:FFFFFF AA字节[2]:55字节[3]:FFFFFFFF AA字节[4]:60字节[5]:0字节[6]:0字节[7]:0字节[8]:17字节[9]:a字节[10]:0字节[11]:0非常感谢您的解释。请使用“bytes”而不是“&bytes”。请使用“bytes”而不是“&bytes”。