回答:
通常はstd::cout
、通常の出力、std::cerr
エラー、およびstd::clog
「ログ」に使用します(これは、何を意味するにせよ)。
主な違いはstd::cerr
、他の2つのようにバッファーされないことです。
古いC stdout
とに関連してstderr
、にstd::cout
対応しstdout
、while std::cerr
とstd::clog
両方に対応しますstderr
(std::clog
バッファリングされている場合を除く)。
clog
もに出力することを読みましたcerr
。それに基づいて、どちらを選びますか?clog
が通常「ロギング」用である場合、なぜそれをエラーストリームに送りたいのですか?ログはcout
エラーではなく、「通常のログ」(別名)に似ています。
cerr
とclog
はどちらも標準の「エラー」出力を使用しますが、clog
バッファリングされているため、のように見えますcout
。エラー出力のためにどれを選ぶべきですか?おそらく私がリストできるよりも多くの理由に依存し、ケースごとに決定する必要があります。
標準出力ストリーム(cout):
クラスのcout
インスタンスですostream
。cout
通常は表示画面である標準出力デバイスで出力を生成するために使用されます。画面に表示する必要のあるデータはcout
、挿入演算子(<<
)を使用して標準出力ストリーム()に挿入されます。
バッファなしの標準エラーストリーム(cerr): cerr
エラーの出力に使用される標準エラーストリームです。これもostream
クラスのインスタンスです。以下のようcerr
である非バッファリングされ、我々はすぐにエラーメッセージを表示する必要がある場合、それが使用されるように。エラーメッセージを保存して後で表示するためのバッファはありません。
バッファ付き標準エラーストリーム(clog):これもostream
クラスのインスタンスであり、エラーを表示するために使用されますがcerr
、エラーは最初にバッファに挿入され、完全に満たされなくなるまでバッファに格納されます。
さらに読む:basic-input-output-c
これら3つのストリームの違いはバッファリングです。
次のコードを確認し、DEBUGを3行で実行してください:f(std :: clog)、f(std :: cerr)、f(std :: out)、3つの出力ファイルを開いて何が起こったかを確認してください。これらの3行を入れ替えて、何が起こるかを確認できます。
#include <iostream>
#include <fstream>
#include <string>
void f(std::ostream &os)
{
std::cin.clear(); // clear EOF flags
std::cin.seekg(0, std::cin.beg); // seek to begin
std::string line;
while(std::getline(std::cin, line)) //input from the file in.txt
os << line << "\n"; //output to the file out.txt
}
void test()
{
std::ifstream in("in.txt");
std::ofstream out("out.txt"), err("err.txt"), log("log.txt");
std::streambuf *cinbuf = std::cin.rdbuf(), *coutbuf = std::cout.rdbuf(), *cerrbuf = std::cerr.rdbuf(),
*clogbuf = std::clog.rdbuf();
std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
std::cerr.rdbuf(err.rdbuf());
std::clog.rdbuf(log.rdbuf());
f(std::clog);
f(std::cerr);
f(std::cout);
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
std::cerr.rdbuf(cerrbuf);
std::clog.rdbuf(clogbuf);
}
int main()
{
test();
std::cout << "123";
}
C ++ 17標準草案から:
30.4.3ナローストリームオブジェクト[narrow.stream.objects]
istream cin;
1オブジェクトは、(30.11.1)で宣言された
cin
、オブジェクトstdin
に関連付けられたストリームバッファからの入力を制御します<cstdio>
。2オブジェクト
cin
が初期化された後、をcin.tie()
返します&cout
。それ以外の状態は、basic_ios<char>::init
(30.5.5.2)で必要なものと同じです。
ostream cout;
3オブジェクトは、(30.11.1)で宣言された
cout
、オブジェクトstdout
に関連付けられたストリームバッファへの出力を制御します<cstdio>
。
ostream cerr;
4オブジェクトは、(30.11.1)で宣言された
cerr
、オブジェクトstderr
に関連付けられたストリームバッファへの出力を制御します<cstdio>
。5オブジェクト
cerr
が初期化された後、cerr.flags() & unitbuf
はゼロ以外でをcerr.tie()
返します&cout
。それ以外の状態は、basic_ios<char>::init
(30.5.5.2)で必要なものと同じです。
ostream clog;
6オブジェクトは、(30.11.1)で宣言された
clog
、オブジェクトstderr
に関連付けられたストリームバッファへの出力を制御します<cstdio>
。
cout
に書き込みstdout
ます。cerr
とclog
にstderr
標準stdout
出力()は、プログラムからエラーや診断以外の出力を受け取ることを目的としています。たとえば、エンドユーザーに表示したり、いくつかの処理ステージにストリーミングしたりできる正常な処理からの出力です。
標準エラー(stderr
)は、プログラムがユーザーの期待する出力を生成していない、または生成していない可能性があることを示す警告やエラーメッセージなどの診断出力を目的としています。この入力は、出力データが次の処理ステージにパイプされる場合でも、エンドユーザーに表示されます。
cin
とcerr
結びついているcout
両方とも、cout
I / O操作自体を処理する前にフラッシュします。これにより、に送信されたプロンプトcout
が、プログラムがから入力を読み取るのをブロックする前に表示され、を介してエラーを書き込む前にcin
への以前の出力cout
がフラッシュされますcerr
。これにより、両方が同じ端末/ファイル/に送信された場合に、メッセージが生成順に発生します。等..
これとは対照的clog
です-そこに書き込むと、バッファーに入れられず、何にも関連付けられないため、フラッシュする前に適切なサイズのロギングをバッファーに入れます。これにより、メッセージのスループットが最も高くなりますが、ターミナルを読んだりログをテーリングしたりするコンシューマーにはメッセージがすぐに表示されない可能性があります。
coutとclogはどちらもバッファーに入れられますが、cerrはバッファーに入れられず、これらはすべて事前定義されたオブジェクトであり、クラスostreamのインスタンスです。これら3つの基本的な使用法は、coutが標準入力に使用されるのに対し、clogおよびcerrはエラーの表示に使用されます。cerrがバッファリングされない主な理由は、バッファに複数の出力があり、エラー例外がコードに記述されている場合、cerrが効果的に実行できるエラーをすぐに表示する必要があるためです。
私が間違っていたら訂正してください。
coutは通常、一部のステートメントをユーザー画面に表示するために使用されます。ex-:cout << "Arlene Batada";
出力:
アーリーン・バタダ
stdout
、stdin
(cin
)がありstderr
、デフォルトで使用されます。私はバッファリングの変更clog
だけcerr
であると考えています。