我正在读一个二进制文件。前16位表示数组索引,接下来的16位表示将要列出的16位项的数量,然后16的剩余倍数表示所有这些16位项。例如,文件'program'的以下十六进制转储:
30 00 00 02 10 00 F0 25
表示索引0x3000,其后跟0x0002个元素,分别为0x1000和0xF025。
FILE *fp = fopen(program, "rb");
char indexChar, nItemsChar;
u_int16_t index, nItems;
fread (&indexChar, 2, 1, fp);
fread (&nItemsChar, 2, 1, fp);
address = strtol(&indexChar, NULL, 16);
nItems = strtol(&nItemsChar, NULL, 16);
for (u_int16_t i = 0; i < nItems; ++i)
{
fread (state->mem + index + i, 2, 1, fp);
}
我甚至不确定这种方法是否有效,因为我在尝试将fRead()转换为nItemsChar时得到了EXC_BAD_ACCESS。我做错了什么?
答案 0 :(得分:0)
你混淆了ascii(文本)文件i / o和二进制文件。
而只是使用
fread(&index, sizeof(index),1,fp);
fread(&nItems, sizeof(nItems),1,fp);
然后是for循环。请注意,这假定写入的文件具有与处理器/配置相同的字节顺序。
答案 1 :(得分:0)
uint16_t index, *nItems;
fread (&index, sizeof(uint16_t), 1, fp);
nItems = (uint16_t*)calloc(index, sizeof(uint16_t));
fread (nItems, sizeof(uint16_t), index, fp);