2011-04-27 15 views
2

C++ではfflush(stdin)が本当に必要ですか?この方法でバッファ内の改行をフラッシュするのは良いことですか?fflush(stdin)の代替品ですか?

+1

入力ストリームには決してfflushを呼び出さないでください。また、CとC++ I/Oを混在させないでください。 –

答えて

7

fflush(stdin)への呼び出しは、Cでは(したがって、C++では)未定義の動作です。

C言語の標準、ISO 9899:7.19.5.2/2

1999年の状態出力ストリームまたは最新の 操作が入力されなかった更新ストリームへストリームポイントであれば、 fflush関数は、そのストリームの書き込みされていないデータをファイルに書き込むためにホスト環境に配信します( )。動作はC++で、行の次の終了までの全体の入力を廃棄するに 未定義

ありそうでない、最も堅牢なアプローチが点滅し、離れて行く」プログラムについては

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

です"、おそらくWindowsプラットフォームでコンソールアプリケーションを実行していますか?このようなアプリケーションは、コンソールウィンドウ(Start-> run-> cmd.exe)から実行することをお勧めします。

+0

これは動作しますが非常に扱いにくいです。** std :: numeric_limits :: max()** – mukesh

+0

** max()**とは何ですか?** numeric_limits **は何ですか**ストリームのサイズ** – mukesh

+0

私はそれが最も堅牢なものなら、私はそれを使用すべきだと思ったが?? – mukesh

0

コードの末尾にあるgetchar()は、stdin(入力バッファ)の次の文字を取得します。そこに文字がない場合、ユーザーが何かを入力するまで待機します。 fflush(stdin)は入力バッファをクリアします。

入力バッファをクリアしているため、getcharがユーザーの次の入力を待つため、fflushがあるとコードが待機するのはこのためです。しかし、あなたがバッファに何かを残しているように見えるので、getcharはプログラムを終了させます。

終了後にプログラムを開いたままにしておきたい場合は、そこから退出してください。すぐに終了したい場合は、フラッシュを外してください。

4

getchar()の代わりにcin.get()を使用してください。問題は、C++のI/OストリームとCのI/O関数が同じファイル記述子の上で動作しているが、バッファが異なることです。私は正確に何がデバッグなしで起こっているのかはわかりませんが、文字が入力されるまでプログラムを一時停止するよう呼びかけているgetchar()のように感じています。したがって、データを取得してブロックを解除するので、プログラムを終了します。

まだ問題がある場合は、「\ n」文字を入力しないでください(Enterを押さないでください)。入力後にEnterキーを押すのは、実際にあなたが読むことができる文字です。この問題は通常、覗き見で解消されます(http://www.cplusplus.com/reference/iostream/istream/peek/参照)。