2016-10-21 94 views
2

我想從文件行中逐行讀取值並打印它們..輸出結果是它打印了最後一行兩次..爲什麼它會這樣做是因爲最後一行是文件的結尾?從C中讀取文件錯誤

int main(int argc, char* argv[]) { 

    FILE *file = fopen(argv[1], "r"); 
    if (file == NULL){ 
     printf("error\n"); 
     return 1; 
    } 
    unsigned long long address; 
    int rv = fscanf(file, "%lli", &address); 
    printf("%lli\n", address); 
    do{ 
     rv = fscanf(file, "%lli", &address); 
     printf("%lli\n", address); 
    } while (rv!=EOF); 

    fclose(file); 
    return 0; 
} 
+0

使用'「%llu」'而不是''%lli「'來讀取'unsigned long long'值。 (不同於''%lli'',''%lld''和''%llu'''都不支持十六進制和八進制;這似乎不是一個好的解決方案。) –

+0

'if(file == NULL ){perror(argv [1]); return 1;}' –

回答

4

您不檢查「內部」fscanf實際上是否成功。如果您位於文件末尾,則不會讀取任何內容,&address未更新,rv獲取0讀取的字節數。

然後您無條件地打印出address中的任何內容,這恰好是您最後一次成功讀取的內容 - 最後一行。

不要使用DO /時,使用while()

while((rv = fscan(...)) != EOF) { 
    printf(...); 
} 

這樣,如果失敗的fscanf,根本就沒有執行中的printf。

do/while基本上是「至少執行一次」,而while是「執行以下零次或多次」。