解決済み

coutの出力バッファ

  • 困ってます
  • 質問No.4571826
  • 閲覧数675
  • ありがとう数2
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 41% (43/103)

coutは出力バッファにデータをためて、フラッシュするときに文字列を表示させるようですが、これについて質問があります。

std::cout<<"ABC";
for(;;){}

とした場合、無限ループなので、バッファをフラッシュしていない(はず)にも関わらずABCと表示されます。なぜこうなってしまうのか意味がわかりません。
この現象について説明していただけませんか........

テストした環境はVisualC++ 2008 + Windows Vistaです。

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

  • 回答No.2

ベストアンサー率 43% (7610/17465)

それは「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

お礼率 41% (43/103)

うまく処理してくれるわけですね。
回答ありがとうございました。
投稿日時 - 2008-12-23 00:10:31

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 53% (331/615)

# 何かいてるんだろう…orz

tieは親クラスの方でした。
 basic_ios::tie()
に訂正。。
  • 回答No.3

ベストアンサー率 53% (331/615)

#2の方の補足(ここでは「面倒」の例で挙げられているので蛇足か…)です。

ありがちな入出力の交差(cin⇔cout等)には解決策があり、
実用的にはbasic_istream::tie()というメンバ関数が用意されています。
  • 回答No.1

ベストアンサー率 45% (1080/2394)

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

お礼率 41% (43/103)

なるほど。処理系依存ですか..........
他の環境でも試してみます。
投稿日時 - 2008-12-23 00:04:25
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ