c ++中cout缓冲区和endl的结构

时间:2014-09-04 14:51:54

标签: c++

我是C++C++ Primer书中学习的新手。在第一章中,作者讨论了iostreamcoutendl的缓冲区。我无法理解。我这里有两个示例代码。

#include<iostream>
int v1;
int main()
{

    std::cout<<"First Cout!";
    std::cin>>v1;
    std::cout<<"Second Cout!"<<std::endl;
    std::cout<<"Third Cout!\n";

    return 0;
}

我想知道执行每一行后cout缓冲区的状态。

4 个答案:

答案 0 :(得分:5)

流包含一个内存缓冲区,在刷新到最终目标(在本例中为输出控制台)之前写入数据,因为刷新可能是一项昂贵的操作。

在某些情况下,缓冲区可能会自动刷新:当流关闭时,或者有大量缓冲数据,或者流被配置为在每行之后刷新,因为std::cerr

有时您需要手动刷新,例如确保用户看到您已写入std::cout的内容。这可以通过两种方式完成:

  • 在流上调用flush()成员函数;
  • std::flush操纵器流式传输到流中。

std::endl操纵者做了两件事:

  • 插入换行符(或字符序列),相当于<< '\n';然后
  • 刷新流,相当于<< std::flush,后者又会调用流flush()成员函数。

这对于将短消息写入控制台很有用;但应谨慎使用,因为在产生大量输出时会对性能产生相当大的影响。

更复杂的是,一个流可以绑定到另一个流,以便在访问另一个流之前刷新一个流。在这种情况下,coutcin绑定,这就是为什么您在从cin读取之前看到第一个输出,即使没有显式刷新。

最后,所有标准流(包括cout)在程序结束时自动刷新(特别是,当std::ios_base::Init的全局实例被销毁时;但那个细节你不应该&# 39; t需要知道。)

答案 1 :(得分:1)

在第一行之后,输出位于缓冲区中,因此您将无法在终端中看到它。

在第二行之后,endl导致缓冲区被刷新,因此您现在将在终端输出中看到第1行和第2行。

在第三行之后,输出在缓冲区中,在程序退出之前,您将无法在终端中看到它。

修改

当你在第1行和第2行之间放置一个cin时,它会导致cout被刷新。请参阅:std::cin

  

cin与标准输出流cout相关联(参见ios :: tie),表示在对cin执行每次i / o操作之前刷新cout的缓冲区(请参阅ostream :: flush)。

答案 2 :(得分:0)

在第一行之后,cout只包含没有换行符的给定字符串。 在第二行之后,cout还包含一行结尾,文本出现在控制台窗口。 在第3行之后,cout包含另一个字符串,包括行结尾,不一定出现在控制台窗口。 退出main后,将显示第3行的文本。

答案 3 :(得分:-3)

std :: endl只是将EOL(行尾)符号添加到输出中。通常是\ n,但它可能因操作系统而异。