在c ++中,cout,cerr,iostream header的clog有什么区别?什么时候使用哪一个?

时间:2013-05-27 12:05:00

标签: c++ iostream cout clog

我尝试在互联网上研究coutcerrclog之间的区别,但找不到完美的答案。我还不清楚何时使用哪个。任何人都可以通过简单的程序向我解释并说明何时使用哪一个的完美情况?

我访问了this site,其中cerrclog上显示了一个小程序,但在那里获得的输出也可以使用cout获得。所以,我对每个人的确切用途感到困惑。

7 个答案:

答案 0 :(得分:106)

通常,您使用std::cout表示正常输出,std::cerr表示错误,std::clog表示“记录”(这可能意味着您想要的任何意思)。

主要区别在于std::cerr没有像其他两个那样缓冲。


对于旧的C stdoutstderrstd::cout对应stdout,而std::cerrstd::clog都对应{ {1}}(缓存stderr除外)。

答案 1 :(得分:41)

stdoutstderr是不同的流,即使它们都默认引用控制台输出。重定向(管道)其中一个(例如program.exe >out.txt)不会影响另一个。

通常,stdout应该用于实际的程序输出,而所有信息和错误消息都应打印到stderr,这样如果用户将输出重定向到文件,仍会打印信息消息在屏幕上,而不是输出文件。

答案 2 :(得分:8)

  • 使用 cout 作为标准输出。
  • 使用 cerr 显示错误。
  • 使用 clog 进行记录。

答案 3 :(得分:8)

标准输出流(cout):  coutostream类的实例。 cout用于在标准输出设备上产生输出,标准输出设备通常是显示屏。需要在屏幕上显示的数据使用插入运算符(cout)插入标准输出流(<<)。

未缓冲的标准错误流(cerr): cerr是用于输出错误的标准错误流。这也是ostream类的一个实例。由于cerr 未缓冲所以当我们需要立即显示错误消息时会使用它。它没有任何缓冲区来存储错误消息并稍后显示。

缓冲标准错误流(clog):这也是ostream类的一个实例,用于显示错误,但与cerr不同,错误首先插入到< strong>缓冲区并存储在缓冲区中,直到它没有完全填满。

进一步阅读:basic-input-output-c

答案 4 :(得分:5)

这3个流的不同之处在于缓冲。

  1. 使用cerr,输出刷新
      立即
    • (因为cerr不使用缓冲区)。
  2. 使用clog,输出会刷新
    • 完成当前功能后。
    • 显式调用函数flush。
  3. 使用cout,输出刷新
    • 调用任何输出流(cout,cerr,clog)后。
    • 完成当前功能后。
    • 显式调用函数flush。
  4. 请检查以下代码,并通过3行运行DEBUG: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";
    }
    

答案 5 :(得分:1)

cout clog 都被缓冲,但 cerr 是非缓冲的,所有这些都是预定义的对象,它们是类ostream的实例。 这三者的基本用途是 cout 用于标准输入,而 clog cerr 用于显示错误。 cerr 未缓冲的要点可能是因为假设缓冲区中有多个输出并且代码中提到了错误异常,那么您需要立即显示该错误,这可以通过 cerr 有效。

如果我错了,请纠正我。

答案 6 :(得分:-2)

cout通常用于在用户屏幕上显示一些语句。 EX- : cout&lt;&lt;&#;; Arlene Batada&#34 ;;

输出:

Arlene Batada