C++中cout和cerr的区别?
2016-05-25 22:25
239 查看
其实大家平常常会用的主要有三个:cout、cerr、clog,首先简单介绍下三者。‘
这三者在C++中都是标准IO库中提供的输出工具(至于有关的重载问题在此不讨论):
cout:写到标准输出的ostream对象;
cerr:输出到标准错误的ostream对象,常用于程序错误信息;
clog:也是输出标准错误流(这点儿和cerr是一样的),貌似平时很少用到这个啊;
具体在输出的时候,三者是有区别的:
1、cout经过缓冲后输出,默认情况下是显示器。这是一个被缓冲的输出,是标准输出,并且可以重新定向(关于重新定向的意思可以参考下面的例子);
2、cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误,默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向(重定向这点儿好像有争论,有些人说和系统有关,本人还不太明白)
对于为什么有cerr和clog?
比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。
附:
#include <iostream>
using namespace std;
int main()
{
cout << "cout" << endl;
cerr << "cerr" << endl;
return 0;
}
运行此程序之后,我们在命令行执行如下命令:
假设编译运行后的可执行文件名为cerr.exe,其目录为E:\cpro\cerr\Debug\cerr.exe
在命令行下,切换到这个目录下,执行命令:cerr>test.log
命令行输出如下:
E:\cpro\cerr\Debug>cerr>>test2.log
Cerr(这是在命令行下输出的)
查看test2.log文件,发现里面只有
cout
一行。
可能这个就是所谓的重定向输出。
从这里可以看出:
cout是在终端显示器输出, cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符.
cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多,有点不同就是cout 通常是传到显示器输出,但可以被重定向输出到文件,而cerr流中的信息只能在显示器输出.
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.
今天看C++Primer(第四版)的时候又看到了这几个,摘抄一段话,供大家参考:
"标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,而clog对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行窗口联系起来,这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr、clog时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出流的方法。利用重定向可以将这些流与所选择的文件联系起来"
这三者在C++中都是标准IO库中提供的输出工具(至于有关的重载问题在此不讨论):
cout:写到标准输出的ostream对象;
cerr:输出到标准错误的ostream对象,常用于程序错误信息;
clog:也是输出标准错误流(这点儿和cerr是一样的),貌似平时很少用到这个啊;
具体在输出的时候,三者是有区别的:
1、cout经过缓冲后输出,默认情况下是显示器。这是一个被缓冲的输出,是标准输出,并且可以重新定向(关于重新定向的意思可以参考下面的例子);
2、cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误,默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向(重定向这点儿好像有争论,有些人说和系统有关,本人还不太明白)
对于为什么有cerr和clog?
比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。
附:
#include <iostream>
using namespace std;
int main()
{
cout << "cout" << endl;
cerr << "cerr" << endl;
return 0;
}
运行此程序之后,我们在命令行执行如下命令:
假设编译运行后的可执行文件名为cerr.exe,其目录为E:\cpro\cerr\Debug\cerr.exe
在命令行下,切换到这个目录下,执行命令:cerr>test.log
命令行输出如下:
E:\cpro\cerr\Debug>cerr>>test2.log
Cerr(这是在命令行下输出的)
查看test2.log文件,发现里面只有
cout
一行。
可能这个就是所谓的重定向输出。
从这里可以看出:
cout是在终端显示器输出, cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符.
cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多,有点不同就是cout 通常是传到显示器输出,但可以被重定向输出到文件,而cerr流中的信息只能在显示器输出.
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.
今天看C++Primer(第四版)的时候又看到了这几个,摘抄一段话,供大家参考:
"标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,而clog对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行窗口联系起来,这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr、clog时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出流的方法。利用重定向可以将这些流与所选择的文件联系起来"
相关文章推荐
- c++第六次作业
- c++基础:判断闰年
- 【c++程序】链表
- C++中的set_new_handler函数
- C++实验6--数组合并
- c++第六次实验
- CodeVS 1039 数的划分
- C语言编程实现使用AES对文件进行加密
- C语言中volatile关键字的作用!!!
- C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)
- C++第六次作业
- C++第六次作业
- 第六次c++作业————代码篇
- C语言C++语言中静态变量和静态函数
- 俄罗斯方块C语言的初步感受
- OJ提交题目中的语言选项里G++与C++的区别(转)
- c语言程序的了解及认识.(150206226贾鸿飞)
- C++第六次上机实验
- POJ 3748 位操作 C++
- 基于arm的C++反汇编 结构体和类