zoukankan      html  css  js  c++  java
  • C++中输出流的刷新问题和 endl和 的区别

    《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,不用 不就好了吗?

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

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

  • 相关阅读:
    yum管理工具
    ansible简介,简单实用
    ssh服务简介及应用与服务的进程的类型
    keepliave
    NFS
    编译安装redis4.0
    redis多实例和高可用
    NTP时间服务
    ssl简介与openssl的使用
    一些高效学习方法-牛人是怎么来的
  • 原文地址:https://www.cnblogs.com/taqikema/p/7743914.html
Copyright © 2011-2022 走看看