2012-05-03 77 views
0

我想加載filedata到2d數組,但是當調用fread時,我得到一個EXC_BAD_ACCESS錯誤。EXC_BAD_ACCESS當讀取文件數據到二維數組

這是我在嘗試讀我的文件:

char data[21][23]; 
FILE* file = fopen("1.txt", "r"); 
fread(data, 1, sizeof(data), file); // EXC_BAD_ACCESS 
+1

除了一件小事情之外,不能說出這裏有什麼問題......你應該使用「rb」,而不是「r」。等等,是'file == NULL'? –

+0

用rb替換r,似乎對問題沒有任何影響。文件不是NULL。 – Kurt

+0

數據被任何機會聲明爲'const'?或者,它是一個局部變量,並且由於嵌套的函數調用和/或其他本地變量(大型數組/結構體)過多而導致堆棧耗盡? –

回答

1

在C中,2維陣列(n×m個)被表示爲n個指針的數組的大小m×n個陣列。

fread會讀入指定指針指向的內存區域。

在你的情況下,fread會將數據寫入n個指針應該存儲的位置。您不能簡單地在C中的二維數組上使用fread()或任何類似的方法。相反,首先讀入大小爲m * n的1維數組,然後將指針複製到'行的開始處'變成指針數組:

char tmp[21*23]; 
FILE* file = fopen("1.txt", "r"); 
fread(tmp, 1, sizeof(tmp), file); 
char* data[21]; 
int i; 
for(i = 0; i < sizeof(data)/sizeof(char*); i++) { 
    data[i] = &tmp[23*i]; 
} 

更新:樣本代碼包含一個錯誤(I使用的sizeof(數據),其中,在64位系統中,將返回的8倍所希望的值,從而導致另一個EXC_BAD_ACCESS;))

+0

在fread上仍然收到EXC_BAD_ACCESS錯誤。在做了更多的研究後,我發現它只發生在ios上,就像我之前推測的那樣。 – Kurt

+0

這個答案和刪除的答案一樣好。緩衝區是一維數組還是二維數組是完全不相關的。 –