我是C++
从C++ Primer
书中学习的新手。在第一章中,作者讨论了iostream
,cout
和endl
的缓冲区。我无法理解。我这里有两个示例代码。
#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
缓冲区的状态。
答案 0 :(得分:5)
流包含一个内存缓冲区,在刷新到最终目标(在本例中为输出控制台)之前写入数据,因为刷新可能是一项昂贵的操作。
在某些情况下,缓冲区可能会自动刷新:当流关闭时,或者有大量缓冲数据,或者流被配置为在每行之后刷新,因为std::cerr
是
有时您需要手动刷新,例如确保用户看到您已写入std::cout
的内容。这可以通过两种方式完成:
flush()
成员函数; std::flush
操纵器流式传输到流中。 std::endl
操纵者做了两件事:
<< '\n'
;然后<< std::flush
,后者又会调用流flush()
成员函数。这对于将短消息写入控制台很有用;但应谨慎使用,因为在产生大量输出时会对性能产生相当大的影响。
更复杂的是,一个流可以绑定到另一个流,以便在访问另一个流之前刷新一个流。在这种情况下,cout
与cin
绑定,这就是为什么您在从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,但它可能因操作系统而异。