• ベストアンサー

coutの出力バッファ

coutは出力バッファにデータをためて、フラッシュするときに文字列を表示させるようですが、これについて質問があります。 std::cout<<"ABC"; for(;;){} とした場合、無限ループなので、バッファをフラッシュしていない(はず)にも関わらずABCと表示されます。なぜこうなってしまうのか意味がわかりません。 この現象について説明していただけませんか........ テストした環境はVisualC++ 2008 + Windows Vistaです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

それは「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が毎回勝手にフラッシュしてから帰って来る」または「出力先が画面の場合はバッファリングしない」と言う動作をしているのです。

sirn
質問者

お礼

うまく処理してくれるわけですね。 回答ありがとうございました。

その他の回答 (3)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

# 何かいてるんだろう…orz tieは親クラスの方でした。  basic_ios::tie() に訂正。。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

#2の方の補足(ここでは「面倒」の例で挙げられているので蛇足か…)です。 ありがちな入出力の交差(cin⇔cout等)には解決策があり、 実用的にはbasic_istream::tie()というメンバ関数が用意されています。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

フラッシュは「ここで書き出せ」という指定であり、これがない場合にいつ書き出すかは処理系依存です。 要は「明示的にフラッシュしなくても書き出されるけどそれがいつになるかは知らんよ」って事です。

sirn
質問者

お礼

なるほど。処理系依存ですか.......... 他の環境でも試してみます。

関連するQ&A