2017-02-23 137 views
-1
int findMaxAndMinValues(FILE *file) 
{ 
    int current_number, max_number = INT_MIN, min_number = INT_MAX; 
    rewind(file); 
    while (fscanf(file, "%d", &current_number)!=EOF) 
    { 
     printf("%d \n", current_number); 
     if (current_number > max_number) max_number = current_number; 
     if (current_number < min_number) min_number = current_number;  
    } 
    printf("Max: %d, Min: %d\n", max_number, min_number); 
    return 0; 
} 

所以這工作正常,如果文本文件只充滿數字(和空格/新行相應)。但是如果我有一個角色,它會在遇到角色之前開始循環讀取它讀取的最後一個數字。 這是文本文件:C fscanf永遠不會返回EOF

1 
2 
3 4 5 
16 
12312 
hello 

而結果就是12312每行不休更新。
旁邊的問題:有沒有更好的方法來找到文本文件中的最小/最大值的數字? %s的fscanf而不是fscanf? 編輯:謝謝你的回答,這裏是我如何固定它:

int findMaxAndMinValues(FILE *file) 
{ 
    int current_number, max_number = INT_MIN, min_number = INT_MAX; 
    int temp; 
    rewind(file); 
    while ((temp=fscanf(file, "%d", &current_number))!=EOF) 
    { 
     if (!temp) { fgetc(file); } 
     else { 
      printf("%d \n", current_number); 
      if (current_number > max_number) max_number = current_number; 
      if (current_number < min_number) min_number = current_number; 
     } 
    } 
    printf("Max: %d, Min: %d\n", max_number, min_number); 
    return 0; 
} 
+0

你忘了問一個問題。你沒有代碼來讀取你的文件中的「hello」,所以沒有任何東西會讀取它,所以你永遠不會到文件的末尾。 –

回答

2

閱讀手冊頁。 fscanf()可以返回除EOF以外的其他值。特別是,如果轉換失敗 - 特別是,如果fscanf()遇到非數字字符 - 它將返回零來表示沒有讀取任何內容。

您需要對此信息採取行動。否則,下一次也會返回零。之後的那段時間,無限的。

+0

「在早期匹配失敗的情況下甚至爲零」哦,我確實想念它..謝謝你的答案。 – KayleMaster

0

如果程序輸入包含非數字,則代碼無限循環的原因是fscanf()不會消耗輸入,但它無法匹配,但在匹配失敗的情況下,它也不會返回EOFEOF僅在輸入結束時之前執行成功轉換或發生匹配故障或發生讀取錯誤時才返回。 (讀取錯誤是I/O錯誤 - 與匹配失敗完全不同)。當您的特定程序遇到匹配失敗時,它只是循環回去並嘗試讀取完全相同的輸入(等待被讀取)再次。解決問題

一種方法是fscanf()的返回值與預期(1)項的數目進行比較,如果你看到任何東西從迴路斷線,是否EOF0,或什麼:

while (fscanf(file, "%d", &current_number) == 1) // ... 

當程序遇到一個非數字時會停止讀取數字;如果你想讓跳過非數字,那麼這也可以完成,但它會更復雜一點。

+0

是的,情況正是如此。我添加了一張支票並進行了修正(代碼如上)!哇stackoverflow真棒 – KayleMaster

相關問題