0

feof()関数を使用すると、出力ファイルに最後の値が 2 回出力されます。どうすればそれを回避できますか? 私の出力は

12
6
15
13

そして、私が持っています

12
6
15
13
13

ありがとうございました!

while(!feof(pfile1))
{       
    sum=0;
    fscanf(pfile1,"%d%d%d",&choice,&day,&val);
    if(choice==0)
    {
        i=day-1;
        a[i]=a[i]-val;
    }
    else if(choice==1)
    {
        for(i=day-1;i<=val-1;i++)
        {
            sum=sum+a[i];

        }
        fprintf(pfile2,"%d\n",sum);     
    }
}
4

5 に答える 5

1

これは、feof フラグが設定されるのは、ファイルの最後を読み取った直後だけだからです。この問題を解決するには、feof を以下の fscanf に置き換え、引数の数を確認します。

3 未満の場合は、何らかのエラーが発生したことがわかります...たとえば、ファイルの終わりに達しました。

実際、上記の理由から、できるだけ feof を使用しないでください。

これにいくつかのコードで下線を引くには:

while(fscanf(pfile1,"%d%d%d",&choice,&day,&val) == 3) {
    //Continue reading
}
fclose(pfile1);
fclose(pfile2);
于 2012-08-22T07:45:54.063 に答える
1

投稿されたコードはfeof()、失敗した読み取りを処理するまで検出されないため、目にする動作が発生します。

feof()呼び出しの直後に確認するか、作成された割り当ての数を返すfscanf()結果を確認する必要があります。fscanf()

if (3 == fscanf(pfile1,"%d%d%d",&choice,&day,&val))
{
    /* All three integers successfully read. */
}

ループの別の可能な構造 (MichalAnderson のコメントで示唆されているように):

while (3 == fscanf(pfile1,"%d%d%d",&choice,&day,&val))
{
}
于 2012-08-22T07:45:56.367 に答える
1

1 つのオプションは、次の戻り値を確認することですfscanf

成功すると、関数は正常に読み取られたアイテムの数を返します。このカウントは、予想される読み取り数と一致するか、または一致しない場合はゼロになることもあります。データが正常に読み取られる前に入力エラーが発生した場合は、EOF が返されます。

したがって、次のようなものです:

if( fscanf(pfile1,"%d%d%d",&choice,&day,&val) <= 0 )
{
    break;
}

もう 1 つのオプションはfeof、実行後にチェックすることfscanfです。例えば:

if( feof( pfile1 ) )
{
    return; // or something
}
do
{
    // the same loop body
}
while( ! feof( pfile1 ) );
于 2012-08-22T07:46:46.167 に答える
0
fscanf(pfile1,"%d%d%d",&choice,&day,&val);

ここでは、入力ファイルから整数を読み取っています。fscanfは、EOFに達するまでファイルをスキャンします。3つの整数を読み取るたびに、3を返します。fsacnfによって返される値が3未満の場合、バッファ値が自動的に割り当てられます。したがって、これが出力で繰り返される値を取得する理由です。

fscanf()の戻り値で値3をチェックしてプログラムを編集し、選択に関してif elseステートメントを実行すると、目的の出力が得られます。

例1:-

次の内容の入力ファイルについて考えてみます。-

0 2 3

1 1 2

(--blank--)//ここで、fscanfは整数をスキャンしますが、空白行であるため、EOFに到達し、-1を返し、バッファー値(以前の値)を使用します。

次に、出力ファイル:-

118

118

例2:-

入力ファイル(空白行なし):-

0 2 3

1 1 2

出力ファイル:-

118

于 2012-08-22T09:04:59.060 に答える
0

によって返される読み取り要素の数を確認する必要がありますfscanf: 待っているものではない場合 (3)、ループから抜け出す必要があります。

この場合、最後の読み取り行で 2 回作業しているだけです。

ドキュメントから:

戻り値

正常に完了すると、これらの関数は、正常に一致して割り当てられた入力項目の数を返します。

于 2012-08-22T07:46:19.783 に答える