前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cout/cerr/clog之异同极其重定向

cout/cerr/clog之异同极其重定向

作者头像
用户7886150
修改2021-02-25 10:23:35
1.3K0
修改2021-02-25 10:23:35
举报
文章被收录于专栏:bit哲学院

参考链接: C++ cerr

最近刚入手了一本《C++ Primer(第五版)》,开始按照C++0x的标准把之前积累的C++知识重头梳理一遍。在看到“初识输入输出”这一小节时,见书中提到了cout/cerr/clog三个输出对象,但说得又不分明,于是百度了一下,学习了这三者间的异同以及重定向方法,但同时又发现网上关于重定向的说法和我的实测结果不吻合,故总结为此文,与大家交流讨论。 

C++的iostream库中定义了4个IO对象,除1个标准输入对象cin之外,其余3个都是输出对象,它们分别是: 

cout:又叫标准输出; 

cerr:又叫标准错误; 

clog:难道叫“标准日志”?没见过有哪本书上如此为它命名。 

它们的共同点: 

1. cout/cerr/clog都不是C++预定义的关键字,它们是ostream流类的对象,在iostream中定义(iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流)。 

2. 它们都是用来在屏幕上显示一段文字信息,这些信息都是写到同一个窗口。 

3. 它们都可以把信息重定向输出到磁盘文件,包括外部重定向和内部重定向(详见最后两个例子)。 

它们的不同点: 

1. cout与clog流在内存中对应开辟了一个缓冲区,用来存放流的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符。 

2. cerr流所输出信息不经过缓冲区,直接输出给屏幕。 

关于它们共同点中的第3条,这里有两个示例,分别演示了如何进行外部和内部重定向。 

例1. 外部重定向: 

假设有如下代码: 

#include<iostream>

int main()

{

    std::cout<<"cout"<<std::endl;

    std::cerr<<"cerr"<<std::endl;

    std::clog<<"clog"<<std::endl;

    return 0;

编译生成D:\EX01.exe。在cmd中执行命令: 

D:\>EX01.exe 

屏幕上输出: 

cout 

cerr 

clog 

若执行命令D:\>EX01.exe > D:\ex01.txt 或执行 D:\>EX01.exe 1> D:\ex01.txt 

屏幕上输出: 

cerr 

clog 

而文本“cout”已经被重定向输出到了D:\ex01.txt中。 

若执行命令D:\>EX01.exe 2> D:\ex01.txt 

屏幕输出: 

cout 

此时,文本“cerr”和“clog”都被重定向输出到了D:\ex01.txt中。 

例2. 内部重定向 

下面以对cerr输出流的重定向为例,cout和clog也可同样操作。 

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

    ofstream file("D:\\ex01.txt");

    streambuf *err = cerr.rdbuf(file.rdbuf());

    cerr << "cerr1" <<endl;

    cerr.rdbuf(err);

    cerr << "cerr2" <<endl;

    return 0;

由以上可知,cout/cerr/clog三者功能都差不多,既然如此,那为什么C++会定义三个功能相当的对象呢?我一开始的粗浅见解是:这是为了提高程序的可读性而设计的,当我们在维护代码时,看到cout就知道是一般性的输出,看到cerr就知道这里是要输出一个错误信息,看到clog,也许就是要输出一般性的日志信息。后来又在CSDN上找到一篇文章,感觉他说得比我专业,比我正确,故引用于此,这里是原文链接: 

http://blog.csdn.net/mengxiangying504/article/details/5008841  

对于为什么有cerr和clog 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。 你说,你到什么地方借内存,存放你的错误信息? 所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。 缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档