2014-10-31 99 views
0

我必須爲類使用並行數組來存儲學生成績的數據。我們要在執行程序時使用Linux命令「<」來給出陣列數據。c - 從文件中讀取數據到數組

./a.out < inputfile 

但是,當我運行該程序時,我得到了程序用於訪問數組中數據的菜單的無限循環。它看起來像程序正在跳過我用來從函數填充數組並使用文件中的數據作爲單獨函數中的菜單scanf()的函數。

下面是我使用填充陣列功能:

void populate(int idarray[],int testone[], int testtwo[],float hw[],int max) 
{ 
    int counter = 0; 
    while(scanf("%d", &idarray[counter]) != EOF) 
    { 
     if(idarray[counter] != -1) 
     { 
      //scanf("%f %d %d", &hw[counter], &testone[counter], &testtwo[counter]); 

      scanf("%f",&hw[counter]); 
      scanf("%d",&testone[counter]); 
      scanf("%d",&testtwo[counter]); 
      counter++; 
     } 
     if(counter == max-1) 
      break; 
    } 
} 

「MAX」是數組的邊界。

輸入文件看起來像:

1983990 75.6 39 78 1935440 78 50.03 34

+0

只是想知道你的while循環是因爲counter == max - 1還是EOF而中斷。如果是前者,那麼你仍然會在stdin中輸入輸入,這將作爲輸入給你的菜單選項,而不受你的控制 – Titus 2014-10-31 19:17:53

+0

你可以給出一個(小的)輸入例子嗎?你是否已經在調試器中一行一行地檢查代碼,並檢查每個'scanf'調用返回的內容? – 2014-10-31 19:18:26

+0

我增加了計數器== max -1作爲一個調試,因爲我最初得到分段錯誤:11在運行時錯誤。 – 2014-10-31 19:23:41

回答

0

我看不出有什麼深刻錯了你的功能,但你的終止條件出現一個地關閉。如果在現在進行測試的地方進行測試,實際上是兩倍。想想當max爲0或1

爲了適應可能性max是0,你需要測試的終止條件(正確)在每次循環的開始,閱讀什麼之前發生了什麼。另外,我傾向於傾向於測試不平等而不是平等,因爲當我的索引編制有點錯誤時,會更好地處理不當行爲。所以在這種情況下,當counter >= maxcounter < max時,我會中斷。

1

檢查您的while循環是否因計數器== max - 1或EOF而中斷。如果是前者,那麼你將仍然有輸入stdin,將作爲輸入提供給你的菜單選項,而無需你的控制

說明: 如果你的while循環由於「counter == max -1」而中斷,這意味着您的「最大」(數組大小)比輸入文件中輸入的總數(十進制數)小 。如果你的「最大」(數組大小)是合適的,那麼它只會被EOF破壞。 現在,如果在達到EOF之前休息時間斷開,這意味着您沒有消耗已傳遞給stdin的所有輸入十進制數,這意味着即使在您的while循環終止之後,仍會有消耗的輸入數 。這個尚未被消費的輸入將被消費(在其他 單詞將作爲輸入)由您的菜單選擇的「scanf」(它可以選擇下一個動作)。這就是光標不在等待您輸入菜單選項的原因

您也可以通過在調用菜單功能之前調用(I am not able to flush stdin) 之前的方法強制清除標準緩衝區緩衝區,以便它可以等待你的輸入選擇

+0

我剛剛檢查它是否因爲couter == max-1或EOF而退出,並且由於EOF而退出。我不知道這意味着什麼。 – 2014-10-31 19:35:24

+0

您提到「添加計數器==最多-1作爲調試,因爲我最初得到分段錯誤:11」 現在是否修復了原始分段錯誤?因爲你說這是因爲EOF現在終止 – Titus 2014-10-31 19:45:23

+0

如果你的代碼以EOF結束,我不明白你的菜單選項爲什麼會自動跳過,因爲在那段時間stdin是空的 – Titus 2014-10-31 19:48:20