- ベストアンサー
無限ループで出力ストリームが表示されないのはなぜですか?
次のソースコードをVC++で実行したところ、入力の表示ができませんでした。 でも、無限ループを削除すると、正常に表示されます。 非常に基本的な質問かもしれませんが、理由がわかりません。 ご存知でしたら教えてください。よろしくお願い致します。 #include <iostream.h> int main() { char ss[80]; cout << "何か入力してください:"; cin >> ss; cout << "入力したのは[" << ss << "]です\n"; for(;;) { } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
cout 内の出力バッファに溜まったままになっているように思えます。 > cout << "入力したのは[" << ss << "]です\n"; これを: cout << "入力したのは[" << ss << "]です" << endl; もしくは cout << "入力したのは[" << ss << "]です\n" << flush; としてみてください。
その他の回答 (2)
- ranx
- ベストアンサー率24% (357/1463)
> 無限ループを入れると、cout内の出力バッファに溜まったままになるのはどうしてなのでしょうか? バッファ内のデータは、次のようなタイミングで出力されます。 ・バッファが一杯になって、さらにデータが送り込まれた時。 ・プログラムを終了する時(出力ストリームを閉じる時)。 ・flush等で明示的に出力が指示された時。 ご質問のプログラムでは、まだバッファに余裕があるのです。しかも、プログラムは終わらない。 明示的に出力しているわけでもない。 というわけで、表示されません。
お礼
ご回答いただきありがとうございます。 なるほど、coutで出力したい場合は、明示的に指示しなければならないのですね。 ためしにcoutをprintfに置き換えてみましたところ、無限ループがあっても入力した内容を表示しました。 これはprintfだと強制的に書き出しを行っているからなのでしょうか。 ストリームについてまだまだ知らないことが沢山あるので、これから勉強していこうと思います。 どうもありがとうございました!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 無限ループを入れると、cout内の出力バッファに溜まったままになるのはどうしてなのでしょうか? 吐き出すきっかけを失うからです。 ループがなければ、プログラム終了までに後始末が行われ、そのタイミングで出力されます。
お礼
何度もお答えいただき、大変感謝しております。 出力ストリームを吐き出す「きっかけ」というものがあるのですね。 初めて知りました。 う~ん、プログラミングの世界は奥が深いんですね。 とても参考になりました。どうもありがとうございました!
お礼
ご回答ありがとうございます。 ご指摘のとおり、endlかflushを使うと上手くいきました。 でも、無限ループを入れると、cout内の出力バッファに溜まったままになるのはどうしてなのでしょうか? あつかましいとは思いますが、できればご教授ください。m(__)m