4

私の質問は簡単ですが、Googleで見つけることができないので、ここにいます。

基本的に、例として、入力ファイルから EOF までの整数の束を読み込んでいます。fgetc を使用して確認しましたが、ファイル ポインタを 2 番目の整数のアドレスに移動します。チェック時にファイルポインタを移動せずに、このwhileループでEOFをチェックするにはどうすればよいですか?

このループでは、整数をスキャンするよりもはるかに複雑なことを行うことに注意してください。また、私が fgets ではなく fscanf を使用していることについては言及しないでください。私が言いたいことを示すための簡単な例です。

while(fgetc(ifp) != EOF)
{

    fscanf(ifp, "%d", &test);
    printf("%d\n", test);
}

たとえば、入力ファイルに 1 ~ 10 の整数がある場合、上記のコードは次のように出力されます。

2 3 4 5 6 7 8 9 10

1が足りない!

4

6 に答える 6

7

fgetc指定されたストリームの内部ファイル位置インジケータによって現在ポイントされている文字を返します。内部ファイル位置インジケータは、次の文字に進められます。使用do{ }while();すると問題が解決します。

于 2013-08-05T05:32:48.030 に答える
6

EOF 条件は実装の詳細と見なす必要があります。ここで本当に重要なのは、fscanf が正常に値を返したかどうかです。

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

一方、これは、ロジックをループの途中に配置することが理にかなっている場合の 1 つのように感じます。

while(1) {
    int ret = fscanf(ifp, "%d", &test);
    if (ret != 1)
        break;
    printf("%d\n", test);
}

特にデバッグの場合は、検査可能な変数を含む個別のステートメントに分割すると便利です。

于 2013-08-05T05:41:20.187 に答える
2

fgetc(ifp)ファイルポインタを進めるため、最初の整数をスキップします

代わりに使用: -

while(1)
{

    if(fscanf(ifp, "%d", &test)!=1) 
         break;
    printf("%d\n", test);
}
于 2013-08-05T05:32:12.763 に答える