本文用于记录C++中std::cout与std::cerr、std::clog的异同
std::cerr
是C++标准库中的标准错误输出流,用于向标准错误设备输出信息,通常用于报告程序的错误和异常情况。与之相对的,std::cout
是标准输出流,用于向标准输出设备输出一般的程序输出。std::clog
是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。
一、 std::cerr
和 std::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
#include
//按行两列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
int main() {
// 输出日志消息到 std::clog
std::clog << "This is a log message." << std::endl;
return 0;
}
总之,std::clog
是一个用于输出程序日志信息的有用工具,通常在日常程序开发和调试中使用,以记录程序的运行状态和事件。它提供了一种与标准输出 std::cout
和标准错误输出 std::cerr
相比更适合输出日志信息的方式。