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

其实大家平常常会用的主要有三个: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++中cout、cerr、clog的区别相关推荐

  1. cout/cerr/clog的区别

    cout/cerr/clog都是C++提供的标准输出流,那这三个到底有什么区别? cout: 标准输出流,一般缓冲区满或者程序结束才刷新缓冲区 cerr: 标准输出错误,输出一条语句就会刷新一次缓冲区 ...

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

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

  3. java中的stack类和C++中的stack类的区别

    文章目录 1 java中的stack类和C++中的stack类的区别 1.1 java中的stack类 1.2 C++中的stack类 1.3 分析 不经意间想到了这个问题,存到栈中的是对象的引用,还 ...

  4. C++中重载与重写函数区别及虚函数(转载)

    C++中重载与重写函数区别及虚函数 C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的 ...

  5. C++中 list与vector的区别

    C++中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C++ vector和list的区别 1.vecto ...

  6. C与C++中++i和i++的区别

    C与C++中++i和i++的区别 文章目录 C与C++中++i和i++的区别 前言 一.C++中区别 二.C中区别 前言 i++和++i很明显的区别就是:++i是先对i进行加一操作然后再返回i的值,而 ...

  7. 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

    指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运 ...

  8. c++中别名和指针*的区别

    c++中别名&和指针*的区别 int n;int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,对m的任何操作,对 ...

  9. 深度学习中FLOPS和FLOPs的区别与计算

    深度学习中FLOPS和FLOPs的区别与计算 FLOPS FLOPs 单位换算 Params和FLOPs的计算 CONV标准卷积层 FC全连接层 NVIDIA GPU的浮点计算能力 GPU的计算能力的 ...

  10. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

最新文章

  1. 机器学习-Andrew Ng课程笔记
  2. 排列若干个字符串,判断是否首尾可以连接在一起
  3. linux centos8新特性及安装教程
  4. 高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...
  5. Android RecyclerView拖放
  6. php 如何生成txt文件,PHP生成TXT文件
  7. Visual Basic(VB6.0)精简版
  8. 2022年 MathorCup 思路分享
  9. oem13c安装参考
  10. html毕业论文参考文献,本科毕业论文参考文献规范格式
  11. 【Go语言】深入浅出chan(各种实例场景+分析)
  12. 云流化方案为水利数字孪生带来哪些新变化?
  13. Guava-Splitter工具类
  14. 批量修改后缀名的方法,批量修改文件后缀名
  15. Vue(狂神学习笔记)2021-10-8
  16. phpqrcode简单在线二维码生成工具源码 非第三方接口
  17. Python - 内置函数详解(截至v3.6.x)
  18. 【Transformers】第 3 章:Transformers剖析
  19. 【文献阅读2】Cytological and transcriptome analyses reveal abrupt gene expression for meiosis and sacchari
  20. matlab代码折叠与分节注释

热门文章

  1. Linux 系统管理 : usermod 命令详解
  2. 内网穿透+ssh登录打造私人云服务器
  3. 【PyTorch】torch.nn.Transformer解读与应用
  4. 红米5双清_红米手机双清方法
  5. vue在移动端出现的问题以及解决方式
  6. 物联网技术部培训---贪心算法
  7. 使用Lambda(拉姆达)对集合进行排序,一行代码即可解决
  8. 在IDEA中写Python
  9. 【优化求解】基于遗传算法优化PARSEC 方法的翼型形状附matlab代码
  10. mysql转化为GaussDB_gaussDB数据库常用操作命令