c++ cout cerr clog的区别

来源:互联网 发布:淘宝卖家寄灵位 编辑:程序博客网 时间:2024/04/19 21:43

c++ primer 第五版 对于cout,ceer,clog的定义如下:

cout(ostream): object used to write to the standard output. Ordinarily used to write the output of a program. 

cerr(ostream): object tied to the standard error, which often writes to the same device as the standard output. By default, writes to cerr are not buffered. Usually used for error messages or other output that is not part of the normal logic of the program. 

clog(ostream): object tied to the standard error. By default, writes toclogare buffered. Usually used to report information about program execution to a log file. 

作用:从定义中可以看到cout是基础的输出,主要用于项目文件的输出。cerr用于输出错误信息(应该是多用于调试代码吧),clog用于输出日志文件。

缓冲区(buffer):

cerr(无缓冲标准错误)-----没有缓冲,发送给它的内容立即被输出
clog(缓冲标准错误)--------有缓冲,缓冲区满时输出
cout-------------------------标准输出
三个都是ostream类定义的输出流对象,
cout是在终端显示器输出,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符.
cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多,有点不同就是cout
通常是传到显示器输出,但可以被重定向输出到文件,而cerr流中的信息只能在显示器输出.
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.


关于缓冲区:


endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
 程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。


那么什么是刷新缓冲区呢?到网上找到资料如下:


以缓冲方式打开一个文件时,往文件里写几个字节,一般不会立即真正把这几个字节写入文件,只有当缓冲区满时才真正写盘。如果想在缓冲区满之前写盘保存,可以做冲刷缓冲区动作。

下列行为引发冲刷动作:
1)缓冲区满时;
2)行输出时遇endl,cerr或cin时;
3)执行冲刷函数;
4)关闭文件。


原文地址: http://blog.csdn.net/zx824/article/details/6644455

原创粉丝点击