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,就可以直接使用 。

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

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/taqikema/p/7743914.html
Copyright © 2011-2022 走看看