1

より多くの出力バッファがありますか?その場合、 ?endlに関連付けられている出力バッファのみをフラッシュしcoutますか?バッファが1つしかない場合、2つのオブジェクトcerrclog区別するものは何ですか?

4

2 に答える 2

3

endlストリーミング先のストリームの出力バッファをフラッシュします。例えば:

cout << ... << endl;   // flushes the output buffer of 'cout'
cerr << ... << endl;   // flushes the output buffer of 'cerr'
ofstream file("filename");
file << ... << endl;   // flushes the output buffer of 'file'

との唯一の違いは、cerrデフォルトでバッファリングされることですが、そうではありません。およびマニピュレータを使用して、任意のストリームのバッファリングをオンまたはオフにできます。例えば:clogclogcerrstd::unitbufstd::nounitbuf

cerr << nounitbuf;   // cerr is now buffered
clog << unitbuf;     // clog is now unbuffered

「unitbuf」は「バッファサイズを1にする」、つまりバッファリングをオフにすることを意味することに注意してください。

于 2012-06-10T23:02:51.767 に答える
3

C(およびそれが元のUNIX環境)でのI / Oは、ファイルシステム内のファイルなどの読み取りまたは書き込み(またはその両方)が可能なバイトの抽象的なシーケンスであるデータ「ストリーム」、または次のようなデバイスを介して行われます。端末(または画面とキーボード)。

C標準ライブラリヘッダーは、データストリームのハンドルとして機能<stdio.h>する型を宣言します。FILEまた、を宣言し、stdintypeを使用して、それぞれ標準入力ストリーム、標準出力ストリーム、および標準エラーストリームを参照します。stdoutstderrFILE*

C ++標準ライブラリはstd::istreamstd::ostreamデータストリームとの対話に使用できるクラス(総称してiostreamsと呼ばれます)を定義します(C ++ iostreamsクラスは単に「ストリーム」と呼ばれることもあるため、用語は少し混乱しますが、同じ単語は抽象データも意味します<stdio.h>FILE`が参照するストリーム。)

C ++グローバルstd::istreamオブジェクトstd::cinは標準入力ストリーム(つまり、参照するのと同じストリームstdin)に関連付けられ、グローバルstd::ostreamオブジェクトstd::coutは標準出力ストリームに関連付けられ、グローバルオブジェクトstd::cerrstd::clog別個のオブジェクトですが、両方とも標準エラーストリームに関連付けられます。

cerrとの違いclogは、デフォルトでclogは、書き込まれた文字を内部バッファに格納するstreambufを使用し、バッファがいっぱいになったとき、または明示的にフラッシュされたときにのみそのデータを標準エラーストリームに書き込むのに対し、cerr'sstreambufは内部バッファリングを行わないことです。したがって、すべてが標準エラーストリームに直接書き込まれます。これらは別々のオブジェクトであるため、デフォルトの動作が異なる別々のstreambufがありますが、最終的には同じ標準エラーストリームに書き込みます。

std::endl任意std::ostreamのに書き込むことができるため、書き込むと、にstd::cout << std::endl関連付けられたストリームがフラッシュされcoutます。これは通常、標準出力ストリームです。書き込むstd::clog << std::endlと、に関連付けられたストリームがフラッシュされclogます。これは通常、標準のエラーストリームです。

于 2012-06-10T23:51:13.793 に答える