2016-10-21 26 views
2

ファイルから行ごとに値を読み込んで出力しようとしていますが、最後の行が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

''%lli "'ではなく ''%lli "'を使用して、 '' unsigned long long'値を読み込みます。 ( ''%lli ''とは違って、' '%lld''や ''%llu ''のどちらも16進数と8進数をサポートしていません;そのための良い解決策はないようです。) –

+0

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

答えて

4

「内側」fscanfが実際に成功したかどうかはチェックしません。ファイルの末尾にある場合は、何も読み取られません。&addressは更新されず、rvは読み取られたバイトに対して0を取得します。

次に、addressの内容を無条件に印刷します。これは最後に正常に読み取ったもの、つまり最後の行です。

はしばらく()関数fscanfが失敗した場合

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

その方法は、printfのは単純に実行されていないを使用し、DO /しばらく使用しないでください。

do/whileは基本的には「少なくとも1回以下」とし、whileは「0回以上行う」とします。

関連する問題