より多くの出力バッファがありますか?その場合、 ?endl
に関連付けられている出力バッファのみをフラッシュしcout
ますか?バッファが1つしかない場合、2つのオブジェクトcerr
をclog
区別するものは何ですか?
2 に答える
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
デフォルトでバッファリングされることですが、そうではありません。およびマニピュレータを使用して、任意のストリームのバッファリングをオンまたはオフにできます。例えば:clog
clog
cerr
std::unitbuf
std::nounitbuf
cerr << nounitbuf; // cerr is now buffered
clog << unitbuf; // clog is now unbuffered
「unitbuf」は「バッファサイズを1にする」、つまりバッファリングをオフにすることを意味することに注意してください。
C(およびそれが元のUNIX環境)でのI / Oは、ファイルシステム内のファイルなどの読み取りまたは書き込み(またはその両方)が可能なバイトの抽象的なシーケンスであるデータ「ストリーム」、または次のようなデバイスを介して行われます。端末(または画面とキーボード)。
C標準ライブラリヘッダーは、データストリームのハンドルとして機能<stdio.h>
する型を宣言します。FILE
また、を宣言し、stdin
typeを使用して、それぞれ標準入力ストリーム、標準出力ストリーム、および標準エラーストリームを参照します。stdout
stderr
FILE*
C ++標準ライブラリはstd::istream
、std::ostream
データストリームとの対話に使用できるクラス(総称してiostreamsと呼ばれます)を定義します(C ++ iostreamsクラスは単に「ストリーム」と呼ばれることもあるため、用語は少し混乱しますが、同じ単語は抽象データも意味します<stdio.h>
FILE`が参照するストリーム。)
C ++グローバルstd::istream
オブジェクトstd::cin
は標準入力ストリーム(つまり、参照するのと同じストリームstdin
)に関連付けられ、グローバルstd::ostream
オブジェクトstd::cout
は標準出力ストリームに関連付けられ、グローバルオブジェクトstd::cerr
はstd::clog
別個のオブジェクトですが、両方とも標準エラーストリームに関連付けられます。
cerr
との違いclog
は、デフォルトでclog
は、書き込まれた文字を内部バッファに格納するstreambufを使用し、バッファがいっぱいになったとき、または明示的にフラッシュされたときにのみそのデータを標準エラーストリームに書き込むのに対し、cerr
'sstreambufは内部バッファリングを行わないことです。したがって、すべてが標準エラーストリームに直接書き込まれます。これらは別々のオブジェクトであるため、デフォルトの動作が異なる別々のstreambufがありますが、最終的には同じ標準エラーストリームに書き込みます。
std::endl
任意std::ostream
のに書き込むことができるため、書き込むと、にstd::cout << std::endl
関連付けられたストリームがフラッシュされcout
ます。これは通常、標準出力ストリームです。書き込むstd::clog << std::endl
と、に関連付けられたストリームがフラッシュされclog
ます。これは通常、標準のエラーストリームです。