7

この投稿によると、 std::cout は\n、対話型デバイス (ターミナル ウィンドウなど) に接続されると、自動的にフラッシュします。.flush()それ以外の場合 (たとえば、ファイルにパイプされる場合)、完全にバッファリングされて動作し、またはでのみフラッシュされstd::endlます。

Microsoft Visual C++ でこの動作をオーバーライドして、完全にバッファー モードにするか行バッファー モードにするかを選択できるようにする方法はありますか?

4

3 に答える 3

12

anon (2009 年 4 月 28 日) の回答とは対照的に、この動作はオペレーティング システムや「コンソール ソフトウェア」とは何の関係もありません。

C++ の<iostream>ストリームは、C のストリームと相互運用できるように設計されてい<stdio.h>ます。目標は、 の使用と/std::coutの使用を混合できるようにすることです。これを実現するために、は C のストリームの上に実装されます。標準出力が端末デバイスに接続されている場合、実際に行バッファリングされるのは Cです。printfputsstd::coutstreambufstdoutstdout

(プログラムが 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

于 2015-12-31T06:40:35.217 に答える
1

これは C++ の問題ではなく ( \n 何かをフラッシュする言語要件はありません)、オペレーティング システムおよび/またはコンソール ソフトウェアの問題です。コンソールが改行を見つけたときにバッファをフラッシュしたい場合は、それが可能であり、ほとんどがそうしていると思います。C++ ランタイムのバッファー (C++ コードからある程度制御できる) とコンソール アプリケーションのバッファー (制御できない) を区別することが重要であることに注意してください。

参考までに、標準の iostream ライブラリにはunitbufと呼ばれるフラグがあり、これを設定すると、各出力操作の後にバッファがフラッシュされます。たとえば、std::cerr ストリームに対して設定されます。ただし、1 回の操作で複数の '\n' を出力できるため、これは '\n' 文字とは関係ありません。

于 2009-04-28T08:54:43.300 に答える
0

実装は、適切と思われるときはいつでも自由にフラッシュできます。フラッシュするかどうかは、ベンダーによって異なります\n

ios_base& nounitbuf(ios_base& str);C++0x ドラフトから呼び出されたものを確認できます。試してみます。これは、標準 C++ が提供する唯一のものです。

于 2009-04-28T08:58:24.493 に答える