2013-04-25 71 views
1

我在读二进制文件。前16位表示数组索引,接下来的16位表示将要列出的16位项目的数量,然后剩余的16位表示所有这些16位项目。例如,文件“程序”的以下己转储:从二进制文件中反复fread()16位

30 00 00 02 10 00 F0 25 

表示索引0x3000处,具有以下0×0002元素,这些元素为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

用二进制模式'rb'打开它。并且读取的大小是sizeof(u_int16_t)计数1不是读取大小2计数1. – MYMNeo 2013-04-25 04:01:58

+0

哎呀,它应该是'rb'。但是,即使发生了这种变化,它仍然在发生。 – Walker 2013-04-25 04:06:41

+0

您正在将2个字节读入字符。创建indexChar和nItemsChar char [2]。 – Duck 2013-04-25 04:19:02

回答

0

你在混淆ascii(文本)文件的I/O和二进制文件。

  • 计划在FREAD(& nItemsChar,2,1,FP)崩溃,因为你已经读2个字节为1个字节的存储空间(实际上它可以在以前的FREAD搞乱)
  • 然后你尝试使用strtol将其从ASCII转换为长整型,但读取值是二进制

,而不是仅仅使用

fread(&index, sizeof(index),1,fp); 
fread(&nItems, sizeof(nItems),1,fp); 

,然后for循环。请注意,这假定该文件的编写与处理器/配置具有相同的字节顺序。

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);