2014-03-31 29 views
0

我有一個基本的C程序,我必須爲個人軟件過程分配做。我對C相當陌生,所以我真的不知道自己出了什麼問題。請通讀並讓我知道我在做什麼導致它崩潰?分段錯誤(核心轉儲) - 錯誤在哪裏?

我必須讀取一個文件,並將值存儲爲一個數組。它沒有編譯錯誤,只是分段錯誤。

#include <stdio.h> 
#define array_limit 100 

int main (void) 

{ 
    FILE *ifp; 
    char *mode = "r"; 
    ifp = fopen("samplepopulation.txt", mode); 


    if (ifp==NULL) 
    { 
    printf("cannot read file \n"); 
    } 
    else 
    { 
    int i; 
    float sample; 

    float values[array_limit]; 
    i = 0; 

    do 
    { 
     fscanf(ifp, "%f", &sample); 
     if (!feof(ifp)) 
     { 
      values[i] = sample; 
      printf("%f \n", values[i]); 
      i++; 
      if (i>array_limit) 
      { 
       printf("File larger than allowed/n"); 
       break; 
      } 
     } 

     else 
     { 
      printf("read complete"); 
     } 

    } while (ifp!= EOF);  
    } 

    fclose(ifp); 

    return 0; 
} 
+0

,現在是學習如何使用調試器:) –

+0

段錯誤的時間==> GDB – avmohan

+1

你已經用C標籤標記了這篇文章,但是你並沒有在代碼的開頭聲明變量。照顧這種事情...... – adripanico

回答

0

變化

while (ifp!= EOF); 

while (!feof(ifp)); 

還可以從文件掃描這樣的:

if (fscanf(ifp, "%f", &sample)==EOF) //EOF if input failure 
    break; 
+0

另外,檢查fscanf的結果,看看它是否是EOF。該代碼似乎混淆了何時使用feof()以及何時檢查EOF。 – Lundin

+0

如果閱讀失敗與恐怖?在這種情況下,feof永遠不會是真的,因此它將是無限循環。 – avmohan

+0

「如果在第一次轉換(如果有)完成之前發生輸入故障,則fscanf函數返回宏EOF的值;否則,該函數將返回分配的輸入項的數量,該項數可能少於規定的數,或者甚至零,在早期匹配失敗的情況下。「 – Lundin

0

你可能想改變這種

fclose(ifp); 

成爲

if (NULL != ifp) 
{ 
    fclose(ifp); 
} 

或者乾脆進入else分支:

... 

    fclose(ifp) 
    } 

    return 0; 
}