web-dev-qa-db-ja.com

CでEOFを検出

EOFが発生するまでユーザーからの入力を取得するために次のCコードを使用していますが、問題はこのコードが機能せず、最初の入力を取得した後に終了することです。 。 前もって感謝します。

float input;

printf("Input No: ");
scanf("%f", &input);

while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}
25
itsaboutcode

EOFは、値(通常は-1)を持つ単なるマクロです。 getchar()呼び出しの結果など、EOFに対して何かをテストする必要があります。

ストリームの終わりをテストする1つの方法は、feof関数を使用することです。

if (feof(stdin))

「ストリームの終了」状態は、after読み取り失敗のみに設定されることに注意してください。

この例では、おそらくscanfの戻り値を確認する必要があり、これがフィールドが読み取られなかったことを示している場合は、ファイルの終わりを確認します。

42
CB Bailey

EOFはCの定数です。実際のファイルのEOFをチェックしていません。このようなことをする必要があります

while(!feof(stdin))

feof のドキュメントを次に示します。 scanf の戻り値を確認することもできます。正常に変換されたアイテムの数を返します。ファイルの最後に到達した場合はEOFを返します。

9
A. Levy

別の問題は、scanf("%f", &input);のみで読んでいるということです。ユーザーが「pi」などのC浮動小数点数として解釈できないものを入力した場合、scanf()呼び出しはinputに何も割り当てず、進行しません。そこから。これは、「pi」を読み続けようとして失敗することを意味します。

他のポスターが正しく推奨しているwhile(!feof(stdin))の変更を考えると、「pi」と入力すると、以前のinputの値を出力してプロンプトを出力する無限ループが発生しますが、プログラムは新しい入力を処理しません。

scanf()は、作成した入力変数への割り当ての数を返します。割り当てが行われなかった場合、それは浮動小数点数を見つけられなかったことを意味し、char string[100];scanf("%99s", string);のようなものでさらに入力を読む必要があります。これにより、入力ストリームから次の文字列が削除されます(とにかく最大99文字-余分なcharは文字列のnullターミネーター用です)。

ご存知のように、これは私がscanf()を嫌うすべての理由と、代わりにfgets()を使用し、sscanf()を使用して解析する理由を思い出させます。

4
David Thornley