2015-09-25 24 views
0

我想读一个带有9列“100万”行的文件。该项目运作良好,如果该文件具有在最大200,000行,否则我看到以下错误:C:缓冲区溢出中fscanf的分段错误?

分段故障:核心转储

错误退出代码:139

的问题是,我想读取文件以便我可以读取不同列中的值,因此,我无法使用可扫描整行的“fgets”。我无法找到解决这个问题的好办法,我可以得到一些帮助吗?

这是我的节目的快照(省略“Y”的定义(如下所示)):

int main(){ 
int number=290000; 
int k,u,i,n = 10000; 
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number]; 
float l[number],b[number], ns[number], xf,x0,step,s; 

FILE *fp=NULL; 
fp=fopen("File_new.txt","w"); 
printf("Enter x0, xf, no. of subintervals: "); 
scanf("%f%f%d",&x0, &xf,&n); 
FILE* val= NULL; 

printf("k xn yn zn int_val  tau \n"); 
val=fopen("file.txt", "r"); 

for(u=0;u<=(number-1);u++){ 
    fscanf(val,"%f %f %f %f %f %f %f %f %f", &xn[u], &yn[u], &zn[u], &ns_ux[u], &ns_uy[u], &ns_uz[u], &l[u], &b[u], &ns[u]);// \t is tab 
      } 
    for(k=0;k<=(number-1);k++){ 
    step = (xf-x0)/n; 
    s = y(x0,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k]) + y(xf,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k],l[k], b[k], ns[k]); 

    for(i = 1; i < n; i++){ 
     s += 2*y(x0+i*step,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k]); 
     } 
     int_val = s*step/2; 
     fprintf(fp,"%f\t%f\t%1.7f\t%f\n",l[k],b[k],fabs(int_val),ns[k]); 
} 
fclose(fp); 

     return 0; 
} 

回答

7
int number=290000; 
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number]; 

阵列与堆叠290000元件可能会导致问题。您应该使用malloc在堆上分配内存。

float *ns_ux; 
    ns_ux=malloc(sizeof(float)*290000);  // like this for all and check its return 

注意 -

你有许多阵列,所以分配free各一个,或者它可能会导致内存泄漏。

2.检查您的代码中是否返回fopenfscanf

3.为了安全在程序中初始化s

+4

另一个解决方案是'#define number 290000'和'static float ns_ux [number]'等。 –

+0

@ M.M注意到,先生。 – ameyCU

+0

非常感谢你! – Phyast10

0

因为这些阵列上堆叠产生的,你可以尝试做ulimit -s unlimited,以设置“无限制”堆栈大小

0

,因为它之前说,你应该使用malloc和保护它。

float *arr; 

arr = (float *)malloc(sizeof(float) * 290000) 
if (!arr) 
{ 
    printf("error malloc"); 
    exit(0); 
} 

不要忘了自由!