3

これが私のコードです。

#include<stdio.h>
void main(){
    FILE *fp;
    int a,b;
    fp=fopen("hello.txt","r");
    while(!feof(fp)){
      fscanf(fp,"%d %d",&a,&b);
      printf("%d %d\n",a,b);
    }
}

私のhello.txtは

1   2
3   4

私の出力は

1   2
3   4
4   4

最後の行が 2 回印刷されるのはなぜですか。fp が EOF に達していませんか?

また、stackoverflow のタグにはUsually, when it is used, the code using it is wrong. 、どういう意味ですか?

ありがとう。

4

4 に答える 4

6

結果をすぐに確認せずに入力操作を実行してはなりません。

以下が機能するはずです。

while (fscanf(fp,"%d %d",&a,&b) == 2)
{
    printf("%d %d\n",a,b);
}

これは、最初の変換失敗またはファイルの終わりで停止します。または、変換の失敗 (誤った行をスキップするため) とファイルの終わりを区別することもできます。のドキュメントを参照してくださいfscanf

于 2013-03-30T14:07:54.017 に答える
3

また、stackoverflow のタグにはUsually, when it is used, the code using it is wrong.、どういう意味ですか?

これは、feof()関数 (および一般的な EOF に関するその他の機能) の使用方法がしばしば誤解され、間違っていることを意味します。あなたのコードもそうです。

まず、fscanf()は常にあなたが思っていることをするとは限りませんfgets()。ファイルから行を取得するには、ただし、本当に を使用する傾向がある場合は、何かをfscanf()読み取ることができるかどうかを確認してください。読み取れない場合は、必要以上に変数を出力します。したがって、あなたがすべきことは次のとおりです。

fp = fopen("hello.txt", "r");

while(fscanf(fp, "%d %d", &a, &b) == 2) {
    printf("%d %d\n", a, b);
}

fclose(fp);

また、空白を使用してください。コードは非常に読みにくいです。

于 2013-03-30T14:10:46.707 に答える
2

余分な行が表示される理由は、EOF が3 回目の読み取り fscanf試行するまで設定されないためです。そのため、読み取りは失敗し、とにかく結果を出力します。これは、あなたが意図したようなことを行います:

while(1){
  fscanf(fp,"%d %d",&a,&b);
  if (feof(fp))
     break;
  printf("%d %d\n",a,b);
}

(この例ではエラーをチェックせず、EOF のみをチェックすることに注意してください)

于 2013-03-30T14:24:05.253 に答える
0

次のことができます。

#include <stdio.h>

void main(){
    FILE *fp;
    int a,b;
    fp=fopen("file.txt","r");
    while(fscanf(fp,"%d %d",&a,&b)==2)
    {
      printf("%d %d\n",a,b);
    }
}
于 2013-03-30T14:09:22.017 に答える