C fread()未按预期工作

C fread()未按预期工作,c,struct,endianness,fread,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 我想将其内容读入指向一个称为内存的整数数组的结构: typedef struct { // ....Some code.... // Machine memory - all of it unsig

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

0000000 ca de 00 00 00 07 12 01 14 49 16 91 12 da 52 83
0000010 52 d2 52 da                                    
0000014
我想将其内容读入指向一个称为内存的整数数组的结构:

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..
我只在
memory[]
中看到
cade
(或
deca
取决于机器的端部)。它无法阅读其余的内容。我错过了什么?在一行中调用
fread()
两次将使用单个零填充
内存[]
,在这两种情况下,读取的字节数始终为2

衷心感谢您的帮助

确定将读取多少字节。由于传递的是
size==1
count==sizeof(unsigned short)
,因此要求
fread()
读取(可能)2个大小为1的对象——这就是为什么在内存中只看到
cade
(假设不知何故调用了两次)

与其这样做,不如要求:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file)
确定将读取多少字节。由于传递的是
size==1
count==sizeof(unsigned short)
,因此要求
fread()
读取(可能)2个大小为1的对象——这就是为什么在内存中只看到
cade
(假设不知何故调用了两次)

与其这样做,不如要求:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file)
阅读其余部分并不是“失败”;你告诉它只读一个
无符号的short

fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);
第二个和第三个参数被称为
size
nmemb
,这意味着每个数据项的大小和要读取的数据项的数量。您传递的是1(即每个项为1字节)和
sizeof(无符号短)
,这可能等于2。所以你告诉它读两个字节

你可能想做一些事情,比如:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file);
(它将返回读取的
无符号短
值的数量,即65536(如果它填满整个缓冲区),或者:

(它将返回读取的字节数,即如果它填满整个缓冲区,则可能会返回131072个字节)。

读取其余字节不是“失败”;你告诉它只读一个
无符号的short

fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);
第二个和第三个参数被称为
size
nmemb
,这意味着每个数据项的大小和要读取的数据项的数量。您传递的是1(即每个项为1字节)和
sizeof(无符号短)
,这可能等于2。所以你告诉它读两个字节

你可能想做一些事情,比如:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file);
(它将返回读取的
无符号短
值的数量,即65536(如果它填满整个缓冲区),或者:


(它将返回读取的字节数,即如果它填满整个缓冲区,可能会返回131072)。

您希望
sizeof(unsigned short)
返回什么?是的,unsigned short是两个字节,因此我看到了我在这里犯的错误。您希望
sizeof(unsigned short)
返回什么?是的,unsigned short是两个字节,所以我看到了我在这里犯的错误。谢谢。我做了第一次建议的编辑,我的输出读取了10个字节,但我的数组仍然只填充了“cade”,我用一个简单的print语句来确认。为什么没有填充阵列?我最终会将其写入一个文本文件,因此我需要确认数组是否已填充。@J_code:“使用简单打印语句进行确认。”您想提出另一个问题。@alk:如果可能,请在新问题中包含完整的代码示例;否则,很难猜测。您还没有说您使用的是哪种打印语句,但“cade”后面跟着一个空字节,字符串处理函数会将其解释为字符串的结尾。因此,如果您试图将整个数组打印为字符串,则输出将停止。谢谢。我做了第一次建议的编辑,我的输出读取了10个字节,但我的数组仍然只填充了“cade”,我用一个简单的print语句来确认。为什么没有填充阵列?我最终会将其写入一个文本文件,因此我需要确认数组是否已填充。@J_code:“使用简单打印语句进行确认。”您想提出另一个问题。@alk:如果可能,请在新问题中包含完整的代码示例;否则,很难猜测。您还没有说您使用的是哪种打印语句,但“cade”后面跟着一个空字节,字符串处理函数会将其解释为字符串的结尾。因此,如果您试图将整个数组打印为字符串,则输出将停止。