2013-04-25 78 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);