この投稿によると、 std::cout は\n
、対話型デバイス (ターミナル ウィンドウなど) に接続されると、自動的にフラッシュします。.flush()
それ以外の場合 (たとえば、ファイルにパイプされる場合)、完全にバッファリングされて動作し、またはでのみフラッシュされstd::endl
ます。
Microsoft Visual C++ でこの動作をオーバーライドして、完全にバッファー モードにするか行バッファー モードにするかを選択できるようにする方法はありますか?
この投稿によると、 std::cout は\n
、対話型デバイス (ターミナル ウィンドウなど) に接続されると、自動的にフラッシュします。.flush()
それ以外の場合 (たとえば、ファイルにパイプされる場合)、完全にバッファリングされて動作し、またはでのみフラッシュされstd::endl
ます。
Microsoft Visual C++ でこの動作をオーバーライドして、完全にバッファー モードにするか行バッファー モードにするかを選択できるようにする方法はありますか?
anon (2009 年 4 月 28 日) の回答とは対照的に、この動作はオペレーティング システムや「コンソール ソフトウェア」とは何の関係もありません。
C++ の<iostream>
ストリームは、C のストリームと相互運用できるように設計されてい<stdio.h>
ます。目標は、 の使用と/std::cout
の使用を混合できるようにすることです。これを実現するために、は C のストリームの上に実装されます。標準出力が端末デバイスに接続されている場合、実際に行バッファリングされるのは Cです。printf
puts
std::cout
streambuf
stdout
stdout
(プログラムが C++ の標準 I/O ストリームのいずれかを使用する前に)を呼び出しstd::ios_base::sync_with_stdio(false)
て、C のストリーム ライブラリの上層ではなく、基になるファイル記述子と直接通信するように C++ ストリーム ライブラリに指示できます。これにより、C のストリームが完全に回避stdout
され、C++ の I/O ストリームが高速化されますが、2 つのライブラリがうまく混在しなくなります。
別の方法として、 を呼び出して無条件stdout
に完全にバッファリングするように設定することもできstd::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ)
ます。次に、std::cout
まだ書き込んでいますが、改行ごとにフラッシュstdout
することはありません。stdout
これは C++ の問題ではなく ( \n 何かをフラッシュする言語要件はありません)、オペレーティング システムおよび/またはコンソール ソフトウェアの問題です。コンソールが改行を見つけたときにバッファをフラッシュしたい場合は、それが可能であり、ほとんどがそうしていると思います。C++ ランタイムのバッファー (C++ コードからある程度制御できる) とコンソール アプリケーションのバッファー (制御できない) を区別することが重要であることに注意してください。
参考までに、標準の iostream ライブラリにはunitbufと呼ばれるフラグがあり、これを設定すると、各出力操作の後にバッファがフラッシュされます。たとえば、std::cerr ストリームに対して設定されます。ただし、1 回の操作で複数の '\n' を出力できるため、これは '\n' 文字とは関係ありません。
実装は、適切と思われるときはいつでも自由にフラッシュできます。フラッシュするかどうかは、ベンダーによって異なります\n
。
ios_base& nounitbuf(ios_base& str);
C++0x ドラフトから呼び出されたものを確認できます。試してみます。これは、標準 C++ が提供する唯一のものです。