2016-09-16 63 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