欢迎访问宙启技术站
智能推送

C++ 中cerr和cout的区别实例详解

发布时间:2023-05-15 06:40:46

在C++中,有两个预定义输出流对象,分别是cerr和cout,它们经常用来进行标准错误输出和标准输出。那么,cerr和cout的区别是什么呢?本文将为大家详细介绍。

1. 输出目的地不同

最显著的区别在于输出的目的地不同。cout输出到标准输出,而cerr输出到标准错误流。打个比方,标准输出就像是你在对着观众演讲,标准错误输出就像是你在对着镜子练习演讲。标准输出是希望被别人看到的,而标准错误输出是希望自己看到的。

2. 输出缓存不同

cout的输出会被缓存,直到遇到一个回车符或者程序结束才会被输出。而cerr的输出则不会被缓存,直接输出到标准错误流。

考虑以下代码段:

cout << "Hello, World!" << endl; 

cerr << "This is an error." << endl;

如果程序运行得很顺利,那么输出的结果应该是这样的:

Hello, World!

This is an error.

然而,如果程序在执行 cerr << "This is an error." << endl; 这行代码时崩溃了,那么你不会看到 "This is an error." 被输出到屏幕上。这是因为 cerr 的输出没有被缓存,所以即使程序崩溃,它仍然可以立即输出到屏幕上。

3. 重定向不同

一个 C++ 程序可以将标准输出重定向到一个文件,这样程序的输出就不会打印出来,而是被写入到文件中。同样的,程序也可以将标准错误输出重定向到一个文件中。

然而,将 标准输出、标准错误输出 重定向到不同文件时是有不同的效果的。如果程序遇到问题,并输出到标准错误流,这个输出会被输出到屏幕上而不是重定向的文件中。

考虑以下代码段:

freopen("stdout.txt", "w", stdout);

freopen("stderr.txt", "w", stderr);

cout << "This is the standard output." << endl;

cerr << "This is the standard error output." << endl;

对于上面的代码,文件 stdout.txt 会包含 This is the standard output. 字符串,而文件 stderr.txt 会包含 This is the standard error output. 字符串。

然而,下面的代码段:

freopen("stdout.txt", "w", stdout);

freopen("stderr.txt", "w", stderr);

cout << "This is the standard output." << endl;

int a = 1 / 0;

cerr << "This is the standard error output." << endl;

可能在第三行代码处发生除零运算错误,程序就会崩溃,输出的东西将变成:

This is the standard error output.

现在我们可以看到,标准输出被重定向到 stdout.txt 文件中,但标准错误输出被输出到屏幕上而不是 stderr.txt 文件中。

总结

通过本文的介绍,我们可以得出以下结论:

- cout和cerr的输出目的地不同,一个输出到标准输出流,一个输出到标准错误流。

- cout的输出会被缓存,而cerr的输出则不会。

- 将标准输出和标准错误输出重定向后,它们的行为会有所不同。

当进行日志记录时,通常使用cerr输出错误信息,而将程序输出全部保存到文件时,可以重定向标准输出流和标准错误流。此时,cout输出的信息可以看作是一般的程序输出,而cerr输出的信息可以看作是程序的错误输出。