デバッグの目的でcout
ステートメントを使用するC++コードがいくつかあります。何らかの理由で、最後にstd::cout.flush();
を実行しないと、すべてのデータを印刷できません。
このフラッシュ操作が必要な理由がよくわかりません。
誰か洞察力がありますか?
他の回答に追加するには、次の理由により、デバッグステートメントはcerr
に移動する必要があります。
cerr
はデフォルトでunbufferedです。これは、各出力操作の後に、自動的に自身をフラッシュします。一般的に、これはエラーとデバッグ出力に適しています。(出典:C++標準、§27.3.1¶4-5、§27.4.2.1.2表83)
std::endl
を使用して行を終了していますか?これは、パフォーマンスの問題が必要になるまでは通常の方法ですが、何らかの理由で、代わりに'\n'
を使用する多くのコードが表示されます。
それ以外の場合は、いつでも行うことができます。
std::cout.setf( std::ios_base::unitbuf );
main
の最初のものの1つとして。これにより、すべての<<
の最後にフラッシュが発生します。これは必要以上のことですが、コンソールへの診断出力の場合は、おそらくまったく問題ありません。
最後に\n
がないため、自動的にフラッシュされないデータですか?デフォルトでは、キャリッジリターンが見つかるまで、標準出力は配信されません。
「ストリームに出力を送信しても、必ずしもすぐに出力されるとは限りません。バッファがいっぱいになる、入力から読み取る、プログラムから抜けるなど、特定のイベントが発生するまでバッファで待機する場合があります。詳細は異なる場合があります。」
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
それは正しい行動です。おそらくstd::endl
追加\n
とバッファをフラッシュします。 http://www.cplusplus.com/reference/ostream/endl/
出力を見たい場合は、ストリームをフラッシュする必要があります。
C++では、endl
の代わりにcout
フォーマッタをflush
演算子とともに使用できます。
std::endl
の回答は、返品を希望する場合にのみ有効です。コマンドプロンプトをフラッシュしたい場合、これをどのように行うかわかりません。