之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以下的内容均是本人从网上查阅资料看来整理的,暂时还没有查阅官方资料,不保证准确,欢迎讨论)

其实大家平常常会用的主要有三个: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时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出流的方法。利用重定向可以将这些流与所选择的文件联系起来"

cerr与cout心得相关推荐

  1. cerr与cout的区别

    概念 std::cerr是ISO C++标准错误输出流,对应于ISO C标准库的stderr. 与std::cout不同,ISO C++要求当cerr被初始化后,cerr.flags() & ...

  2. cerr和cout的使用

    之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以下的内容均是本人从网上查阅资料看来整理的,暂时还没有查阅官方资料,不保证准确,欢迎讨论) 其实大家平常常会用的主要有三个:c ...

  3. cin,cerr,clog,cout

    iostream库:包含两个基础类型istream和ostream. 标准库定义了4个IO对象: 1. cin,标准输入,istream类型对象. 2. cout,标准输出,ostream类型对象. ...

  4. C++中cout和cerr的区别

    标准IO库定义的其中3个IO对象: 一个istream类型对象:cin 两个ostream对象:cout,cerr cin:读取标准输入的istream对象,对应于标准输入流(关联到标准输入设备,通常 ...

  5. std::cerr与std::cout区别

    1.cerr 是一个ostream对象,关联到标准错误,通常写入到与标准输出相同的设备.默认情况下,写到cerr的数据是不缓冲的.Cerr通常用于输出错误信息与其他不属于正常逻辑的输出内容. 2.co ...

  6. 【自学C++】C++ cout clog cerr区别

    C++ cout clog cerr区别 C++ cout clog cerr区别教程 在 C++ 中的 std 命名空间中,用于输出的不仅仅只有 cout,还有 clog 和 cerr,分别用于输出 ...

  7. C++ cout打印生成两位16进制数

    在头文件iomanip里的函数setw()是做什么用的? setw指的是用cerr和cout输出数值时每个数值占用的最小宽度,程序必须包含头文件<iomanip.h>,setw设置的宽度仅 ...

  8. c++ 输入输出流关联

    #include <iostream> #include <string> #include <fstream> #include <sstream> ...

  9. matlab的exec程序,C++调用Matlab画图的一段程序

    劳动节闲来无事,写了一天程序,just for fun. 看,这是C++调用Matlab画图的一段程序.暂时不想多解释了,有兴趣的话,看看下面的代码吧. 以下几段代码由上到下,越来越旧.最上面的是最新 ...

最新文章

  1. jqury+css实现可弹出伸缩层
  2. Stars HDU 1541
  3. linux srelf 加壳代码,浅谈被加壳ELF文件的DUMP修复
  4. SpringBoot整合RabbitMQ-创建队列并绑定交换机
  5. 自定义Flutter控件
  6. Glut 回调函数小结
  7. N-gram详解分析
  8. VC++农历与公历转换
  9. 用QuickCHM v2.6 制作帮助文档
  10. Docker(八)Container无法正常启动Restarting (1) Less than a second ago的原因及解决办法
  11. 16种设计思想 - Design for failure
  12. Java毕设项目共享充电宝系统(java+VUE+Mybatis+Maven+Mysql)
  13. 使用Java动态数组的实现
  14. 八核版三星Galaxy S4(I9500)root教程
  15. 各种文件对应的文件类型
  16. Tomcat中如何配置使用APR
  17. B. Subtract Operation(stl,数学)
  18. ct值matlab计算,一篇文章搞定CT值,不要再迷糊了
  19. 手机传感器的意义:未来生活将被彻底改变
  20. 抽象类能实例化吗?——口气很强硬——“不能”(详解)

热门文章

  1. 操作系统学习——分时操作系统
  2. MQ(Message Queue)介绍
  3. 软件测试-制定测试策略
  4. 期货配资的优势和劣势
  5. ZooKeeper3.7.0 编译客户端zookeeper-client
  6. 基于arduino的幻尔总线机器人
  7. 概率图模型(马尔可夫模型)
  8. UNR 1 DAY 2 T1 Jakarta Skyscrapers
  9. 能力不够,你就态度好点
  10. poi编辑word中的chart,对图表数据替换,并刷新图表