本文用于记录C++中std::cout与std::cerr、std::clog的异同

   std::cerr 是C++标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout 是标准输出流,用于向标准输出设备输出一般的程序输出。std::clog 是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。

   一、 std::cerrstd::cout 的主要方面对比:

   1. 输出设备:

   - std::cerr 输出到标准错误设备,通常是控制台或终端。

   - std::cout 输出到标准输出设备,通常也是控制台或终端。

   2. 缓冲:

   - std::cerr 通常是非缓冲的,即它的输出会立即显示在终端上,无需等待缓冲区填满。

   - std::cout 通常是缓冲的,即输出被收集在缓冲区中,然后在换行或程序结束时一次性刷新到终端。

   3. 用途:

   - std::cerr 用于输出错误消息、异常信息和其他临时或紧急情况的诊断信息,通常用于不会对正常程序流程产生影响的信息输出。

   - std::cout 用于一般的程序输出,例如用户界面、数据报告、日志等。


   二、 输出错误消息时,与 std::cout 相比,std::cerr 的优势

   通过第一部分的介绍,我们可以知道在C++程序中用于输出错误消息时,通常推荐使用 std::cerr 而不是 std::cout,输出报错信息时std::cerr` 的主要优势如下:

   1. 非缓冲输出

   std::cerr 是非缓冲的,这意味着 输出消息会立即显示在终端上,而不会等待缓冲区刷新 。这在错误和异常处理中很重要,因为它确保错误消息尽快显示,而不会被延迟,从而帮助程序员更快地定位和解决问题。

   2. 区分标准输出

   使用 std::cerr 使错误消息从标准输出消息(使用 std::cout 输出的消息)明显区分开来。这有助于用户或开发人员在程序运行时识别和定位问题。

   3. 标准错误设备

   std::cerr 默认输出到标准错误设备,通常是终端或控制台。这是一个专门用于报告错误和异常的设备,不会影响标准输出。

   4. 不受缓冲影响

   由于 std::cerr 不受输出缓冲的影响,即使程序崩溃或异常终止,错误消息也可以正常显示,这有助于诊断问题。


   三、 std::cerr与std::cout的使用示例

   在下面的程序中,我们定义了一个名为cout_two_VectorXd的函数,用于按行输出两列Eigen::VectorXd类型的数据,这就要求提供的两个VectorXd类型的参数中存储的数据个数应该相同,否则在输出时会报错

   因此,在输出前,对两个参数的大小是否相同进行了判断,若不同,则使用std::cerr给出报错信息,并返回,若相同,则使用std::cout`输出数据

#include <iostream>
#include <Eigen/Eigen>

//按行两列Eigen::VectorXd类型的数据
void cout_two_VectorXd(const Eigen::VectorXd& data1, const Eigen::VectorXd& data2)
{
   if (data1.size() != data2.size()) {
        std::cerr << "Error: Data sizes do not match." << std::endl;
        return;
    }

    for (int i = 0; i < data1.size(); i++) {
        std::cout << data1[i] << "   " << data2[i] << std::endl;
    }  
}


int main() {
    
    Eigen::VectorXd x(3); // 创建一个长度为3的向量x
    x << 1.0, 2.0, 3.0;  // 为 x 赋初值
    Eigen::VectorXd y(3); // 创建一个长度为3的向量y
    y << 4.0, 5.0, 6.0;  // 为 y 赋初值
    Eigen::VectorXd z(4); // 创建一个长度为4的向量z
    z << 7.0, 8.0, 9.0, 10;  // 为 z 赋初值

    cout_two_VectorXd(x, y);
    cout_two_VectorXd(x, z);

    return 0;
}

   上述程序的运行结果如下:

1   4
2   5
3   6
Error: Data sizes do not match.

   总之,std::cerr 是专门用于输出错误和异常消息的工具,它提供了一些特性,使其在这些情况下更可靠和有用。虽然 std::cout 也可以用于输出错误消息,但它通常是缓冲的,可能会导致消息延迟显示,而且与一般输出混在一起,不容易识别。因此,推荐在错误和异常处理中使用 std::cerr


   四、补充记录:std::clog

   std::clog是c++中的标准日志输出流,类似于 std::cerr,用于输出程序日志和诊断信息,但与 std::cerr 不同,它通常是缓冲的。

   详情如下:

   std::clog 是C++标准库中的标准日志输出流,用于将程序的日志信息发送到标准错误设备(通常是终端或控制台)。它类似于 std::cerr,但与 std::cerr 不同,std::clog 通常是缓冲的,这意味着输出消息被收集在缓冲区中,然后在换行或程序结束时才一次性刷新到终端。

   std::clog 通常用于输出程序的日志信息、诊断信息以及其他不属于错误和异常的消息。它是一个合适的工具,用于跟踪程序的运行、记录事件、调试代码等。

   std::cerr 一样,std::clog 输出到标准错误设备,通常是终端或控制台。这意味着日志消息会与程序的错误和异常信息分开显示,以帮助用户或开发人员识别和处理问题。

   示例用法:

#include <iostream>

int main() {
    // 输出日志消息到 std::clog
    std::clog << "This is a log message." << std::endl;

    return 0;
}

   总之,std::clog 是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。它提供了一种与标准输出 std::cout 和标准错误输出 std::cerr 相比更适合输出日志信息的方式。


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐