2014-04-20 233 views
6

我有以下簡單的程序可以從文本文件(num.txt)中讀取。該文本文件在每行中都有數字1 2 3 4 5。當我運行該程序時,它會打印5次兩次。有人可以告訴我爲什麼會發生這種情況,以及如何解決這個問題?在此先感謝fscanf讀取最後的整數兩次

int main(void) 
{ 
    int number; 
    FILE *file; 

    int i = 0;; 

    file = fopen("num.txt", "r"); 

    while (!feof(file)){ 

     fscanf(file, "%d", &number); 
     printf("%d\n", number); 
     } 

    return 0; 
} 

這裏是我的文本文件num.xtx

1 
2 
3 
4 
5 

而這裏的節目輸出

1 
2 
3 
4 
5 
5 

有額外的5

+0

'而(!FEOF(文件)){':: FEOF()是問題 – wildplasser

+3

我建議你閱讀[這](事業http://stackoverflow.com/questions/5431941/同時,FEOF文件 - 是 - 總是錯的)? – niklasfi

+1

當你看到最後5個時,fscanf返回的值是多少?我打賭它不是1. ;-) –

回答

7

scanf系列函數的手冊頁,

EOF。如果發生讀取錯誤,則返回 EOF,在這種情況下,將設置流的錯誤 指示符,並且將errno設置爲指示 錯誤。

這意味着,最後成功fscanf呼叫從流中讀取file之後,因爲文件結束條件尚未滿足while循環條件!feof(file)是真實的最後一行。這意味着循環執行一次額外的時間,並且變量number的前一個值再次被打印。

請仔細閱讀本 - while(!feof(file)) is always wrong

您應該檢查而不是檢查的文件流文件指示年底的scanf返回值。

#include <stdio.h> 

int main(void) { 
    int number; 
    FILE *file = fopen("num.txt", "r"); 

    // check file for NULL in case there 
    // is error in opening the file 
    if(file == NULL) { 
     printf("error in opening file\n"); 
     return 1; 
    }  

    // check if fscanf call is successful 
    // by checking its return value for 1. 
    // fscanf returns the number of input 
    // items successfully matched and assigned 
    while(fscanf(file, "%d", &number) == 1) 
     printf("%d\n", number); 

    return 0; 
} 
4

失敗第二次fscanf並沒有寫任何東西給number,這就是爲什麼它仍然是5最後一次。要知道fscanf是否成功,您必須檢查其返回值。

fscanf返回它寫入的參數個數。在你的情況下,如果它返回1,它就起作用了;如果它返回0,它沒有。這是你應該檢查而不是feof。如果前 所述第一轉換成功或匹配失敗時達到輸入結束則返回

while (fscanf(file, "%d", &number) == 1) 
{ 
    printf("%d\n", number); 
}