2016-10-22 100 views
-1

我對編程非常陌生,我試圖編寫代碼讀取「numbers.tsv4」(.tsv4表示製表符分隔值,4表示一行)並將數字放入數組中。現在我只關注計算文件中數字的數量,所以我可以初始化數組的大小。在C中打開文件時出現分段錯誤?

int main(void) 
{ 
int cur; 
FILE* spData; 
int size=1; 

spData = fopen("numbers.tsv4", "r");          

while ((cur = fgetc(spData)) != EOF) { 
    if ((cur = fgetc(spData)) == '\t') { 
    size++;} 
} 
fclose(spData); 
printf("%d", size); 
return; 
} 

我不斷收到一個分段錯誤,我改變了很多東西,試圖找出它。有人能幫我一把嗎?謝謝!

+3

您的segfault最可能的原因是「numbers.tsv4」不存在,fopen返回NULL,您的代碼無法檢查它,並且fgetc(NULL)炸燬。附:否則,整體邏輯無論如何都會被徹底打破。它平均無法統計文件中一半的製表符。 –

+0

你是否調試過它來發現在段錯誤之前發生了什麼? – Carcigenicate

回答

0

帶有while語句的結構就是問題所在。在每次迭代開始時,您已經獲得了fgetc()的下一個字符並將其分配給cur。然後在循環內if(...)聲明中,通過調用新的fgetc()並將結果分配給cur來丟棄cur。因此,在下面的方式,它改變:

while ((cur = fgetc(spData)) != EOF) { 
    if (cur == '\t') { 
    size++;} 
} 

你看,當你嘗試調用fgetc()兩次(無論是在while(...)if(...)),你可能會得到在if(...)聲明EOF。然後在while(...)聲明的下一次迭代中,您嘗試訪問文件外的某處,這會導致分段錯誤。