インターネットでcout
、cerr
、およびclog
の違いを調べてみましたが、完璧な答えが見つかりませんでした。どちらを使用するかはまだ明確ではありません。誰もが簡単なプログラムを通して私に説明して、いつどれを使うべきかについて完璧な状況を説明できますか?
このサイト にアクセスしました。これはcerr
とclog
の小さなプログラムを示していますが、そこで得られた出力はcout
を使用して取得することもできます。だから、私はそれぞれの正確な使用法について混乱しています。
stdout
とstderr
は、両方ともデフォルトでコンソール出力を参照しているにもかかわらず、異なるストリームです。それらの一方(たとえばprogram.exe >out.txt
)をリダイレクト(パイピング)しても、もう一方には影響しません。
一般に、stdout
は実際のプログラム出力に使用する必要がありますが、すべての情報とエラーメッセージはstderr
に出力する必要があります。出力ファイルではありません。
通常、通常の出力にはstd::cout
を使用し、エラーにはstd::cerr
を使用し、「ロギング」にはstd::clog
を使用します(意味は何でもかまいません)。
主な違いは、std::cerr
が他の2つのようにバッファリングされないことです。
古いCのstdout
およびstderr
に関連して、std::cout
はstdout
に対応し、std::cerr
およびstd::clog
は両方ともstderr
に対応します(std::clog
がバッファリングされることを除く)。
標準出力ストリーム(cout):cout
はostream
クラスのインスタンスです。 cout
は、通常は表示画面である標準出力デバイスで出力を生成するために使用されます。画面に表示する必要があるデータは、挿入演算子(<<
)を使用して標準出力ストリーム(cout
)に挿入されます。
アンバッファード標準エラーストリーム(cerr):cerr
は、エラーを出力するために使用される標準エラーストリームです。これは、ostream
クラスのインスタンスでもあります。 cerr
はun-bufferedであるため、エラーメッセージをすぐに表示する必要がある場合に使用されます。エラーメッセージを保存して後で表示するためのバッファはありません。
バッファリングされた標準エラーストリーム(clog):これはostream
クラスのインスタンスでもあり、cerr
とは異なりエラーの表示に使用されます。エラーは最初にbufferに挿入され、完全に満たされなくなるまでバッファに保存されます。
さらに読む: basic-input-output-c
これら3つのストリームの違いはバッファリングです。
次のコードを確認して、f(std :: clog)、f(std :: cerr)、f(std :: out)の3行でDEBUGを実行し、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オブジェクト
cin
は、<cstdio>
(30.11.1)で宣言されたオブジェクトstdin
に関連付けられたストリームバッファーからの入力を制御します。2オブジェクト
cin
が初期化された後、cin.tie()
は&cout
を返します。それ以外の状態は、basic_ios<char>::init
(30.5.5.2)に必要な状態と同じです。
ostream cout;
3オブジェクト
cout
は、<cstdio>
(30.11.1)で宣言されたオブジェクトstdout
に関連付けられたストリームバッファへの出力を制御します。
ostream cerr;
4オブジェクト
cerr
は、_<cstdio>
(30.11.1)で宣言されたオブジェクトstderr
に関連付けられたストリームバッファへの出力を制御します。5オブジェクト
cerr
が初期化された後、cerr.flags() & unitbuf
はゼロ以外で、cerr.tie()
は&cout
を返します。それ以外の状態は、basic_ios<char>::init
(30.5.5.2)に必要な状態と同じです。
ostream clog;
6オブジェクト
clog
は、<cstdio>
(30.11.1)で宣言されたオブジェクトstderr
に関連付けられたストリームバッファへの出力を制御します。
cout
はstdout
に書き込み、cerr
およびclog
はstderr
に書き込みます
標準出力(stdout
)は、正常な処理からの出力など、エンドユーザーに表示したり、さらなる処理段階にストリーミングしたりできる、プログラムからの非エラー、非診断出力を受け取ることを目的としています。
標準エラー(stderr
)は、プログラムがユーザーが期待する出力を生成していない、または生成していないことを示す警告およびエラーメッセージなどの診断出力を対象としています。この入力は、出力データが別の処理ステージにパイプされる場合でも、エンドユーザーに表示される場合があります。
cin
およびcerr
はcout
に関連付けられています
I/O操作自体を処理する前に、両方ともcout
をフラッシュします。これにより、プログラムがcout
からの入力をブロックする前にcin
に送信されたプロンプトが表示され、cout
にエラーを書き込む前にcerr
への以前の出力がフラッシュされます。両方が同じ端末/ファイル/などに向けられている場合、メッセージを生成順に時系列に保持します。
これはclog
とは対照的です-そこに書き込むとバッファリングされず、何にも結び付けられないため、フラッシュする前に適切なサイズのロギングをバッファリングします。これにより、メッセージのスループットが最高になりますが、端末を読んだりログを追跡したりする消費者には、メッセージがすぐに見えない可能性があります。
coutとclogは両方ともバッファリングされますが、cerrはバッファリングされず、これらはすべてクラスostreamのインスタンスである事前定義オブジェクトです。これら3つの基本的な使用法は、coutが標準入力に使用されるのに対し、clogおよびcerrはエラーの表示に使用されます。 cerrがバッファリングされていない主な理由は、バッファに複数の出力があり、コードにエラー例外が記載されている場合、そのエラーをすぐに表示する必要があるためですcerr効果的に。
間違っている場合は修正してください。