C fread()未按预期工作
我有一个.obj文件,其内容如下: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
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”后面跟着一个空字节,字符串处理函数会将其解释为字符串的结尾。因此,如果您试图将整个数组打印为字符串,则输出将停止。