2016-09-16 84 views
0

我正在嘗試從文件中讀取多個浮動塊。當我只使用一個變量,它工作正常,但保存到多個浮點數的時候有問題:使用fscanf時出現Segfault

float r_testdata[3276334]; 
float i_testdata[3276334]; 
int e = 1; 

FILE *fpI_i = fopen("/home/users/Documents/document.dat","r"); 

for(int i = 0; i < 3276334;i++) { 
    e = fscanf(fpI_i,"%f %f",&r_testdata[i],&i_testdata[i]); 
    if(e != 1) { 
     fprintf(stderr,"Error reading file\n"); 
    } 

} 
fclose(fpI_i); 

當fscans運行與2讀取它出現segfaults。這看起來像fscanf格式化的問題,但我沒有看到問題是什麼。我查看了類似問題的帖子,但沒有得到修復。

+7

這一切都在相同的功能?我們不能說[因爲你的代碼不是MCVE](http://stackoverflow.com/help/mcve)。如果是,那麼'float real_testdata [3276334];'是(這是?的一部分?)問題---在兩個結構之間,你在棧上分配24MB的數據*。 –

+4

'e!= 1' - >'e!= 2'和拼寫錯誤的變量名稱。 – BLUEPIXY

+0

如果你只是需要掃描浮點數,我建議你使用'double',然後'%lf' – KKastaneda

回答

2

由於巨大的數組,可能會出現堆棧溢出。如果他們都像一個函數內部:

void foo(void) 
{ 
    float r_testdata[3276334]; 
    float i_testdata[3276334]; 

堆棧太小,容納不下他們,導致內存破壞和段錯誤。

你可以讓他們像全球:使用malloc

float r_testdata[3276334]; // Declared outside the function 
float i_testdata[3276334]; 

void foo(void) 
{ 

或更好地利用動態內存分配。像:

float *r_testdata = malloc(3276334 * sizeof(float)); 

,當你與r_testdata做記得打電話free(r_testdata);

正如@BLUEPIXY提到:

此行是錯誤的:

if(e != 1) { 

你想讀兩個值,所以你必須使用:

if(e != 2) { 
+0

這確實確實解決了我希望得到的下一個問題。編輯:也解決了我的尺寸問題,這個固定的,malloc分配我需要的內存。使用Python和Matlab的高級語言讓我受寵若驚 – lyoder