web-dev-qa-db-ja.com

stdoutおよびそれをフラッシュする必要があるC ++

デバッグの目的でcoutステートメントを使用するC++コードがいくつかあります。何らかの理由で、最後にstd::cout.flush();を実行しないと、すべてのデータを印刷できません。

このフラッシュ操作が必要な理由がよくわかりません。

誰か洞察力がありますか?

19
Dixon Steel

他の回答に追加するには、次の理由により、デバッグステートメントはcerrに移動する必要があります。

  • これは、標準エラーに書き込みます。つまり、アプリケーションを実行すると、「通常の」プログラムの出力を、リダイレクトを介してエラー/デバッグ情報から簡単に分離できます。
  • 最も重要なこととして、cerrはデフォルトでunbufferedです。これは、各出力操作の後に、自動的に自身をフラッシュします。一般的に、これはエラーとデバッグ出力に適しています。

(出典:C++標準、§27.3.1¶4-5、§27.4.2.1.2表83)

11
Matteo Italia

std::endlを使用して行を終了していますか?これは、パフォーマンスの問題が必要になるまでは通常の方法ですが、何らかの理由で、代わりに'\n'を使用する多くのコードが表示されます。

それ以外の場合は、いつでも行うことができます。

std::cout.setf( std::ios_base::unitbuf );

mainの最初のものの1つとして。これにより、すべての<<の最後にフラッシュが発生します。これは必要以上のことですが、コンソールへの診断出力の場合は、おそらくまったく問題ありません。

9
James Kanze

最後に\nがないため、自動的にフラッシュされないデータですか?デフォルトでは、キャリッジリターンが見つかるまで、標準出力は配信されません。

4
mah

「ストリームに出力を送信しても、必ずしもすぐに出力されるとは限りません。バッファがいっぱいになる、入力から読み取る、プログラムから抜けるなど、特定のイベントが発生するまでバッファで待機する場合があります。詳細は異なる場合があります。」

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

1

それは正しい行動です。おそらくstd::endl追加\nとバッファをフラッシュします。 http://www.cplusplus.com/reference/ostream/endl/

出力を見たい場合は、ストリームをフラッシュする必要があります。

0

C++では、endlの代わりにcoutフォーマッタをflush演算子とともに使用できます。

0
Stuti

std::endlの回答は、返品を希望する場合にのみ有効です。コマンドプロンプトをフラッシュしたい場合、これをどのように行うかわかりません。

0
mike