1

私はCにかなり慣れていないので、ここにファイルの内容を表示するための非常に単純な関数を持っています. ファイルの最後の行が2回印刷されることを除いて、正常に動作します...EOFを使用する必要があることは知っていますが、関数がEOFを最後の行として認識し、もう一度実行しないようにする方法がわかりません. インターネット上には同様の問題を抱えた場所が 10 億あることは知っていますが、多くは C++ に関するものでした。コードは次のとおりです。

 {
    int count=0, fileEnd=0;

    FILE* rockPtr=fopen("rockact.txt", "r");

    printf("\n%8s%8s%8s%8s%8s\n", "BANDID", "NAME", "SIZE", "CREW", "TRANS");

    do
    {
        fileEnd=fscanf(rockPtr, "%d%s%d%d%s", &(tempBand.rockid), tempBand.bandname, &(tempBand.bandsize), &(tempBand.crewsize), tempBand.transport);
            if (fileEnd !=EOF); //checks EOF has not been reached
            {
                printf("\n%8d%8s%8d%8d%8s", tempBand.rockid, tempBand.bandname, tempBand.bandsize, tempBand.crewsize, tempBand.transport);
                count++;                
            }               
    }
    while (fileEnd !=EOF);

    fclose(rockPtr);
    printf("\n The total amount of rock acts on file is %d\n", count);
    }
4

2 に答える 2

1

あなたは;ifの後に持っています-それを削除します

また、 fscanfのマニュアルを確認してください

読み取りエラーが発生した場合、または読み取り中にファイルの終わりに達した場合は、適切な標識 (feof または ferror) が設定されます。また、データが正常に読み取られる前にいずれかが発生した場合は、EOF が返されます。

これは、ファイルから少なくとも部分的なデータを読み取ることができ、EOF またはエラーに達することができることを意味しますが、fscanf はそれを返しません。

ファイルの終わりに達したかどうかを確認するには、 feof関数を使用する必要があります。

したがって、ロジックは次のようになります。

  1. ファイルから読み取る
  2. 何かが読み取られた場合-表示します。ここでは、返された数値をEOFではなく引数の数と比較する必要があることを意味します
  3. feof を確認する

更新: EOF だけが問題ではないため、ファイルを開く/読み取るときは常に ferror をチェックする必要があります。

于 2013-10-17T18:17:23.593 に答える