2015-09-25 23 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); 
} 

不要忘了自由!