fread()没有按预期工作

时间:2018-05-19 03:13:43

标签: c struct endianness fread

我有一个.obj文件,其内容如下:

0000000 ca de 00 00 00 07 12 01 14 49 16 91 12 da 52 83
0000010 52 d2 52 da                                    
0000014

我想将其内容读入一个指向名为memory的整数数组的结构:

typedef struct {
   // ....Some code....

    // Machine memory - all of it
    unsigned short int memory[65536];
} MachineState;

但是我遇到了fread()的问题。以下列方式声明后:

FILE *src_file = fopen(filename, "rb");
        //Read from binary file
        int byte = fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);

        //Below are print statements for theMachineState->memory and byte..

我只在cade中看到memory[](或deca,具体取决于机器的字节顺序)。它无法读取其余内容。我在这里错过了什么?连续两次调用fread()会将memory[]填充为零,在这两种情况下,读取的字节数始终为2.

真心感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

fread() takes two parameters确定将读取多少字节。由于您要传递size == 1count == sizeof(unsigned short),因此您要求fread()读取(可能)2个大小为1的对象 - 这就是您在内存中只看到cade的原因(假设你以某种方式召唤它两次)。

请求:

,而不是这样做
fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file)

答案 1 :(得分:1)

它没有"失败"阅读其余的;你告诉它只读一个unsigned short

fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);

第二个和第三个参数称为sizenmemb,它们是每个数据项的大小和要读取的数据项的数量。你传递1(即每个项目是1个字节)和sizeof(unsigned short),它可能等于2.所以你要告诉它读两个字节。

您可能打算做以下事情:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file);

(将返回读取的unsigned short值的数量,如果它填满整个缓冲区则返回65536),或者:

fread(theMachineState->memory, 1, sizeof(theMachineState->memory), src_file);

(将返回 bytes 读取的数量,如果它填满整个缓冲区,则可能是131072)。