web-dev-qa-db-ja.com

c ++、cout、cerr、iostreamヘッダーのclogの違いは何ですか?いつどれを使用するのですか?

インターネットでcoutcerr、およびclogの違いを調べてみましたが、完璧な答えが見つかりませんでした。どちらを使用するかはまだ明確ではありません。誰もが簡単なプログラムを通して私に説明して、いつどれを使うべきかについて完璧な状況を説明できますか?

このサイト にアクセスしました。これはcerrclogの小さなプログラムを示していますが、そこで得られた出力はcoutを使用して取得することもできます。だから、私はそれぞれの正確な使用法について混乱しています。

78
Arlene Batada

stdoutstderrは、両方ともデフォルトでコンソール出力を参照しているにもかかわらず、異なるストリームです。それらの一方(たとえばprogram.exe >out.txt)をリダイレクト(パイピング)しても、もう一方には影響しません。

一般に、stdoutは実際のプログラム出力に使用する必要がありますが、すべての情報とエラーメッセージはstderrに出力する必要があります。出力ファイルではありません。

43
riv

通常、通常の出力にはstd::coutを使用し、エラーにはstd::cerrを使用し、「ロギング」にはstd::clogを使用します(意味は何でもかまいません)。

主な違いは、std::cerrが他の2つのようにバッファリングされないことです。


古いCのstdoutおよびstderrに関連して、std::coutstdoutに対応し、std::cerrおよびstd::clogは両方ともstderrに対応します(std::clogがバッファリングされることを除く)。

114
  • 標準出力にはcoutを使用します。
  • cerrを使用してエラーを表示します。
  • ロギングにはclogを使用します。
8
David Vargas

標準出力ストリーム(cout):coutostreamクラスのインスタンスです。 coutは、通常は表示画面である標準出力デバイスで出力を生成するために使用されます。画面に表示する必要があるデータは、挿入演算子(<<)を使用して標準出力ストリーム(cout)に挿入されます。

アンバッファード標準エラーストリーム(cerr):cerrは、エラーを出力するために使用される標準エラーストリームです。これは、ostreamクラスのインスタンスでもあります。 cerrun-bufferedであるため、エラーメッセージをすぐに表示する必要がある場合に使用されます。エラーメッセージを保存して後で表示するためのバッファはありません。

バッファリングされた標準エラーストリーム(clog):これはostreamクラスのインスタンスでもあり、cerrとは異なりエラーの表示に使用されます。エラーは最初にbufferに挿入され、完全に満たされなくなるまでバッファに保存されます。

さらに読む: basic-input-output-c

8
roottraveller

これら3つのストリームの違いはバッファリングです。

  1. Cerrを使用すると、出力がフラッシュされます
    • すぐに(cerrはバッファーを使用しないため)。
  2. Clogを使用すると、出力がフラッシュされます
    • 現在の機能を終了した後。
    • 関数flushを明示的に呼び出します。
  3. Coutを使用すると、出力がフラッシュされます
    • 出力ストリーム(cout、cerr、clog)を呼び出した後。
    • 現在の機能を終了した後。
    • 関数flushを明示的に呼び出します。

次のコードを確認して、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";
}
5
Duc-Viet Ha

ドラフト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に関連付けられたストリームバッファへの出力を制御します。

討論...

coutstdoutに書き込み、cerrおよびclogstderrに書き込みます

標準出力(stdout)は、正常な処理からの出力など、エンドユーザーに表示したり、さらなる処理段階にストリーミングしたりできる、プログラムからの非エラー、非診断出力を受け取ることを目的としています。

標準エラー(stderr)は、プログラムがユーザーが期待する出力を生成していない、または生成していないことを示す警告およびエラーメッセージなどの診断出力を対象としています。この入力は、出力データが別の処理ステージにパイプされる場合でも、エンドユーザーに表示される場合があります。

cinおよびcerrcoutに関連付けられています

I/O操作自体を処理する前に、両方ともcoutをフラッシュします。これにより、プログラムがcoutからの入力をブロックする前にcinに送信されたプロンプトが表示され、coutにエラーを書き込む前にcerrへの以前の出力がフラッシュされます。両方が同じ端末/ファイル/などに向けられている場合、メッセージを生成順に時系列に保持します。

これはclogとは対照的です-そこに書き込むとバッファリングされず、何にも結び付けられないため、フラッシュする前に適切なサイズのロギングをバッファリングします。これにより、メッセージのスループットが最高になりますが、端末を読んだりログを追跡したりする消費者には、メッセージがすぐに見えない可能性があります。

3
Tony Delroy

coutclogは両方ともバッファリングされますが、cerrはバッファリングされず、これらはすべてクラスostreamのインスタンスである事前定義オブジェクトです。これら3つの基本的な使用法は、coutが標準入力に使用されるのに対し、clogおよびcerrはエラーの表示に使用されます。 cerrがバッファリングされていない主な理由は、バッファに複数の出力があり、コードにエラー例外が記載されている場合、そのエラーをすぐに表示する必要があるためですcerr効果的に。

間違っている場合は修正してください。

1