一、cerr的定义及特点
#include
int main()
{
std::cerr << "This is an error message!" << std::endl;
return 0;
}
c++中标准库提供了三种标准输出流(cout、cerr、clog),分别用于输出普通信息、错误信息和日志信息。cerr是C++里面标准错误流,它和cout是完全独立的,不受标准输出流的控制。
cerr最主要的作用就是输出错误信息,跟cout非常相似,只是输出通道和输出内容不同。cerr主要有以下特点:
不经过缓冲区,即时输出 不受标准输出流控制 不会被重定向,一般用于输出错误信息到控制台或者日志文件二、cerr的使用方式
cerr的使用方式和cout非常相似,只是输出通道和输出内容有所不同。下面是一些cerr的使用实例:
#include
#include
int main()
{
std::ofstream log("test.log");
std::cerr << "This is an error message!" << std::endl;
log << "This is a log message!" << std::endl;
return 0;
}
使用cerr输出错误信息,并实时输出到控制台
使用ofstream将日志信息输出到test.log中
三、cerr的应用场景
cerr主要用于输出错误信息,常用于以下场景:
程序发生异常时,输出异常信息 程序调试时,输出变量值或调用栈信息 日志输出时,错误信息需要实时显示到控制台下面是一个应用场景的例子:
#include
#include
#include
void func()
{
try
{
std::string s("test");
std::cout << s[10] << std::endl;
}
catch(std::exception& e)
{
std::cerr << "Exception caught:" << std::endl;
std::cerr << e.what() << std::endl;
}
}
int main()
{
func();
return 0;
}
上述示例中func()函数里面使用了try-catch语句来捕获s[10]的越界异常,捕获到异常后使用cerr输出异常信息并实时显示在终端。
四、cerr输出到日志文件
cerr除了输出到控制台,还可以将错误信息实时输出到日志文件中。下面是一个实例:
#include
#include
int main()
{
std::ofstream log("test.log");
std::streambuf *coutbuf = std::cout.rdbuf();
std::cout.rdbuf(log.rdbuf()); // 将cout的输出重定向到log文件
std::cerr.rdbuf(log.rdbuf()); // 将cerr的输出重定向到log文件
std::cout << "This is a normal message." << std::endl;
std::cerr << "This is an error message." << std::endl;
return 0;
}
通过重定向cout和cerr输出流,可以将所有输出实时写入日志文件中。在实际应用中,也可以通过增加日志级别来选择输出哪些信息。
五、cerr的使用技巧
在使用cerr的过程中,有一些小技巧可以提高输出信息的质量:
使用cerr输出错误信息前,先使用cout清空缓冲区,确保输出不会混杂 出现错误时,及时输出错误信息和调用堆栈,方便调试 通过日志级别控制输出信息的多少六、总结
cerr是C++标准库提供的一种标准错误流,主要用于输出错误信息。相比于cout,cerr更适合用于实时输出错误信息。在使用cerr的过程中,需要注意输出内容的格式和输出方式,以提高输出信息的质量。