プロが教えるわが家の防犯対策術!

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

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

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

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

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

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

お礼日時:2008/12/23 00:10

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



tieは親クラスの方でした。
 basic_ios::tie()
に訂正。。
    • good
    • 0

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



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

フラッシュは「ここで書き出せ」という指定であり、これがない場合にいつ書き出すかは処理系依存です。


要は「明示的にフラッシュしなくても書き出されるけどそれがいつになるかは知らんよ」って事です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/23 00:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!