- ベストアンサー
coutの出力バッファ
coutは出力バッファにデータをためて、フラッシュするときに文字列を表示させるようですが、これについて質問があります。 std::cout<<"ABC"; for(;;){} とした場合、無限ループなので、バッファをフラッシュしていない(はず)にも関わらずABCと表示されます。なぜこうなってしまうのか意味がわかりません。 この現象について説明していただけませんか........ テストした環境はVisualC++ 2008 + Windows Vistaです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
それは「Visual C++ 2008が親切だから」です。 http://support.microsoft.com/kb/94227/ja に書かれている通り、Visual C++ 4.2で古いiostreamを使用した場合、coutが終ってもバッファがフラッシュされず、ABCが表示されません。 これは cout << "年齢を入力して下さい:"; cin >> age_val; cout << "名前を入力して下さい:"; cin >> name_str; などの場合に、本当は cout << "年齢を入力して下さい:" << flush; cin >> age_val; cout << "名前を入力して下さい:" << flush; cin >> name_str; とか cout << "年齢を入力して下さい:"; cout.flush(); cin >> age_val; cout << "名前を入力して下さい:"; cout.flush(); cin >> name_str; とか書かなくてはいけない事を意味します。 ですが「これでは面倒」なので「coutが毎回勝手にフラッシュしてから帰って来る」または「出力先が画面の場合はバッファリングしない」と言う動作をしているのです。
その他の回答 (3)
- MrBan
- ベストアンサー率53% (331/615)
# 何かいてるんだろう…orz tieは親クラスの方でした。 basic_ios::tie() に訂正。。
- MrBan
- ベストアンサー率53% (331/615)
#2の方の補足(ここでは「面倒」の例で挙げられているので蛇足か…)です。 ありがちな入出力の交差(cin⇔cout等)には解決策があり、 実用的にはbasic_istream::tie()というメンバ関数が用意されています。
- D-Matsu
- ベストアンサー率45% (1080/2394)
フラッシュは「ここで書き出せ」という指定であり、これがない場合にいつ書き出すかは処理系依存です。 要は「明示的にフラッシュしなくても書き出されるけどそれがいつになるかは知らんよ」って事です。
お礼
なるほど。処理系依存ですか.......... 他の環境でも試してみます。
お礼
うまく処理してくれるわけですね。 回答ありがとうございました。