我有一个.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.
真心感谢任何帮助!
答案 0 :(得分:2)
fread()
takes two parameters确定将读取多少字节。由于您要传递size == 1
和count == 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);
第二个和第三个参数称为size
和nmemb
,它们是每个数据项的大小和要读取的数据项的数量。你传递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)。