2009-09-15 8 views
20

私は次のCコードを使用してEOFが発生するまでユーザーからの入力を受け取りますが、このコードは機能していません。最初の入力を受けた後に終了します。誰もこのコードで何が間違っているか教えてもらえますか?前もって感謝します。CでのEOFの検出

+3

注:IIRCは、通常、そのユーザーが終了するには、Ctrl + Dをヒットしなければならないことを意味するので、ユーザの入力がEOFをチェックし、パイプで連結されていないと仮定すると、おそらく理想的ではありません、それは不明です – Brian

答えて

40
float input; 

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

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

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

ストリームの終わりをテストする方法の1つは、feofです。 「末端ストリームの」状態でのみ失敗した読み取り後に設定されること。

if (feof(stdin)) 

注意、

あなたの例では、scanfの戻り値をチェックし、読み取られたフィールドがないことを示す場合は、ファイルの終わりをチェックしてください。

+2

ありがとうチャールズベイリー。 – itsaboutcode

+3

ブライアンのコメント:stdinは通常、ユーザーが入力できる数が増えているため、通常はEOFを登録しません。 Unixyシステムでは、通常control-Dを意味します。 –

+0

それはあなたが私の「普通」を意味するかによって異なります。 stdin(ファイルまたはパイプ、unixまたはwindows)をリダイレクトした場合、EOFは通常正しく通知されます。対話的なUNIX端末^ Dでは、通常、Windowsテキストモードで動作し、^ Zは行頭で動作します。 –

8

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

while(!feof(stdin)) 

ここにはfeofのマニュアルがあります。戻り値scanfを確認することもできます。正常に変換されたアイテムの数を返します。ファイルの最後に達した場合はEOFを返します。

+0

FILE関数には、EOFを使用するよりもテストする方が良い変数が含まれていますか?ちょうど半分の時間しか働かない奇妙な関数を使うよりも、実際のファイルポインタの状態を調べるほうが良いでしょう。 – MarcusJ

0

出発点として、あなたは

while(!feof(stdin)) 
4

もう一つの問題だけscanf("%f", &input);を読んでいるということであると

while(!EOF) 

を交換してみてください。ユーザーが "pi"のようにCの浮動小数点数として解釈できないものを入力した場合、scanf()コールはinputに何も割り当てず、そこで処理を進めません。これは、「pi」を読み続けることを試み、失敗することを意味します。

while(!feof(stdin))他のポスターが正しく推薦されている場合、「pi」と入力すると、前の値inputを印刷し、プロンプトを印刷する無限ループが発生しますが、プログラムは新しい入力。

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

あなたが知っている、これは私がscanf()を憎むすべての理由を私に思い出させている、と私は代わりにfgets()を使用して、多分sscanf()を使用してそれを解析する理由。

-1

scanf()の結果を確認して、変換が成功したことを確認する必要があります。そこにいなかった場合、その後の3つのうちの1つは真である:

  1. のscanf()%F変換指定子(つまり、数字ではない何かのために有効でない文字をのどに詰まらされ、ドット、 'e'、または 'E')。
  2. scanf()がEOFを検出しました。
  3. stdinの読み取り時にscanf()がエラーを検出しました。

例:

int moreData = 1; 
... 
printf("Input no: "); 
fflush(stdout); 
/** 
* Loop while moreData is true 
*/ 
while (moreData) 
{ 
    errno = 0; 
    int itemsRead = scanf("%f", &input); 
    if (itemsRead == 1) 
    { 
    printf("Output: %f\n", input); 
    printf("Input no: "); 
    fflush(stdout); 
    } 
    else 
    { 
    if (feof(stdin)) 
    { 
     printf("Hit EOF on stdin; exiting\n"); 
     moreData = 0; 
    } 
    else if (ferror(stdin)) 
    { 
     /** 
     * I *think* scanf() sets errno; if not, replace 
     * the line below with a regular printf() and 
     * a generic "read error" message. 
     */ 
     perror("error during read"); 
     moreData = 0; 
    } 
    else 
    { 
     printf("Bad character stuck in input stream; clearing to end of line\n"); 
     while (getchar() != '\n') 
     ; /* empty loop */ 
     printf("Input no: "); 
     fflush(stdout); 
    } 
} 
+1

行末までクリアするときに無限ループが発生する可能性があります。私は '' while((ch = getchar())!= EOF)&&(ch!= '\ n'))/ * void * /; ''広告をチェックしてEOFをチェックし、 '' moredata = 0; '' – pmg

+0

新しい質問を開きます。 – andig

-2
while(scanf("%d %d",a,b)!=EOF) 
{ 

//do ..... 
} 
+0

私はこれを使っています.... –

+0

何が間違っている:/私は理解していません –