C++中输出流的刷新问题和 endl和 \n的区别

《C++ Primer》第5版 P6中提到endl具有换行和刷新输出流两个作用,那么没有 endl是否还会将输出流中的内容输出到设备中,再刷新输出流呢?

1 cout << "The test";
2 cout << "The test is over!" << endl;

在第2行前加入断点调试,程序输出显示 The test,说明没有 endl,也还是会刷新输出流。

继续运行程序,输出显示 The testThe test is over!。说明在这个例子中,endl只体现出了换行的作用。会不会是书上说错了呢?并不是,虽然 endl具有刷新输出流的作用,但并不代表不使用 endl程序就不会刷新输出流了。查阅资料后发现,以下情况都会刷新缓冲区: 1、程序正常结束。作为 main 返回工作的一部分,将清空所有输出缓冲区。 2、在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。 3、用操纵符endl,fflush,显式地刷新缓冲区,例如行结束符 endl。 4、在每次输出操作执行完后,用 unitbuf 操作符设置流的内部状态,从而清空缓冲区。 5、可将输出流与输入流关联(tie)起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区。

第2点就很有意思,说是不确定的,取决于系统自身的运行状况。知乎上有个回答是这样说的,一般情况下,不加endl大多数情况下,也能正常输出,是因为在系统较为空闲时候,会查看缓存区的内容,如果发现新的内容,便进行输出。但是你并不清楚,系统什么时候输出,什么时候不输出,与系统自身的运行状况有关。而刷新缓存区,是强制性的,绝对性的输出,不取决于系统运行状况。所以正如《C++ Primer》书中所写,为了避免出现没有刷新输出流的情况发生,在使用打印语句来调试程序时,一定要加入 endl或flush操纵符。

这里可能会想到,以后遇到这类问题,干脆直接都使用 endl,不用 \n不就好了吗?

也不是,要知道,endl会不停地刷新输出流,频繁的操作会降低程序的运行效率,这也是C++标准库对流的输入/输出操作使用缓冲区的原因。没有必要刷新输出流的时候应尽量使用 \n,比如对于无缓冲的流 cerr,就可以直接使用 \n。

最后,关于那个知乎回答,不同的编译器得到的结果居然会不一样。我的结果与下面的评论是一样的,哪位大大能够解释一下这个问题。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏田京昆的专栏

基于hashicorp/raft的分布式一致性实战教学

hashicorp/raft是raft算法的一种比较流行的golang实现,基于它能够比较方便的构建具有强一致性的分布式系统。本文通过实现一个简单的分布式缓存系...

2.1K15
来自专栏CodeSheep的技术分享

为Hexo博客添加LiveRe评论系统

2033
来自专栏数据和云

5分钟速成Oracle 12.2 RAC 专家(附ppt下载)

Oracle 12c 在RAC方面提出了很多新的解决方案和特性。这些方案和特性使得Oracle 集群在云和大数据的时代环境下,帮助企业用户上云更具优势。今天我们...

4145
来自专栏北京马哥教育

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下,Linux 甚至不会询问...

3616
来自专栏卡少编程之旅

在Windows上切换node版本的实践

35812
来自专栏格子的个人博客

Tomcat目录文件列表功能和定制化

先说一下背景。 某天,产品小伙伴过来提了一个需求:能不能把公司的需求文档以列表的方式展示出来,当开发者需要哪个的时候,自己在目录中寻找并点击进入(需要哪个点哪...

3203
来自专栏喵了个咪的博客空间

[PhalApi实战篇(1)]Redis队列处理异步任务

[PhalApi实战篇(1)]Redis队列处理异步任务 ? 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. ...

4024
来自专栏跟着阿笨一起玩NET

原创C# 各种通用类集合 终于出炉了,觉得有用尽管拿去吧

已经开源,欢迎 Fork    https://github.com/chrisyanghua/MyHelper.git

4162
来自专栏Python

linux每日命令(25):Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz ,这些文件虽然...

1811
来自专栏java一日一条

9 个使用前必须再三小心的 Linux 命令

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

831

扫码关注云+社区

领取腾讯云代金券