cout/cerr/clog都是C++提供的标准输出流,那这三个到底有什么区别?
cout: 标准输出流,一般缓冲区满或者程序结束才刷新缓冲区
cerr: 标准输出错误,输出一条语句就会刷新一次缓冲区
clog: 标准输出日志,相对来说刷新缓冲区的频率不高
先看一个简单的例子
#includeint main() { std::cout << "output to cout"; std::cerr << "output to cerr"; std::clog << "output to clog"; }
如果我们直接运行该程序,那么这三行都会输出到屏幕
但是,如果我们进行输出重定向,那么cout和cerr/clog会输出到不同的文件(0表示标准输入,1表示标准输出,2表示标准错误输出)
那么,既然有了cerr,为什么还要有clog?
我们都知道程序输入输出都会有缓冲区,缓冲区是在内存中,而文件则是在磁盘中,程序访问内存的速度远快于访问磁盘的速度。所以为了提升效率,程序都会先输出到缓冲区,等缓冲区满了或者在显示刷新缓冲区的时候才会写入到磁盘文件里。但是如果缓冲区还没有满,此时程序崩溃,那么缓冲区中的数据就会丢失,相对来说cerr错误信息就会很重要,为了保证错误信息写入到磁盘文件,程序会经常刷新缓冲区。clog日志信息相对来说就没有那么重要,因此也不会经常刷新缓冲区(注意:频繁的刷新缓冲区会降低运行速度,因为频繁的访问磁盘内容)
std::flush:刷新缓冲区
std::endl:刷新缓冲区并且换行
一般的程序会在程序运行结束才会去刷新缓冲区,但是有时我们不想刷新缓冲区但是想加一个换行,那么就要使用转义字符n
#includeint main() { std::cout << "output to coutn"; std::cerr << "output to cerrn"; std::clog << "output to clogn"; }



