2014-09-04 33 views
0

我是C++的新手学习C++ Primer的书。在第一章中,作者谈到了iostream,coutendl的缓冲区。我无法理解。我在这里有两个示例代码。cout缓冲区和C++中的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

你有没有跑这个代码? – JBL 2014-09-04 14:54:52

+0

是的代码工作正常 – 2014-09-04 15:05:59

+0

不,我的意思是,“你看过它做了什么?你有没有试着去理解?” – JBL 2014-09-04 15:06:37

回答

5

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

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

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

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

std::endl机械手做两两件事:

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

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

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

最后,在程序结束时(具体而言,当std::ios_base::Init全局实例被销毁,但这是你不应该需要了解细节。)所有的标准流,包括cout,会自动刷新

+0

差不多清楚的答案。你能否详细说明一下。为什么在第一行结束后打印,因为没有endl,flush或\ n被调用?这是由于cout被终止/关闭的事实吗?程序结束时会自动关闭蒸汽吗? – 2014-09-04 15:09:59

+0

@wafeeq:我已经更新了答案来回答这些问题。 – 2014-09-04 15:16:17

+0

谢谢。我清楚地明白了这一点。 – 2014-09-04 15:20:24

-3

std :: endl只是将EOL(行尾)符号添加到输出中。通常它的\ n,但它可以从一个OS到另一个不同。

+3

它也刷新了缓冲区。 – 2014-09-04 14:56:45

+0

'std :: endl'和'\ n'有什么区别?我想在缓冲区操作方面有很大的不同。 – 2014-09-04 14:57:28

+0

@MikeSeymour都会刷新缓冲区? – 2014-09-04 14:57:59

1

第一行后,输出在缓冲区,所以你不会看到它在终端。

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

在第三行之后,输出位于缓冲区中,直到程序退出时才会在终端中看到它。

编辑:

当您将线1和2之间的CIN,它会导致COUT被刷新。参见:std::cin

CIN是联系在一起的标准输出流COUT(见IOS ::并列),这表明COUT的缓冲器被刷新(见的ostream ::平齐)上进行CIN每个I/O操作之前。

+0

现在呢?为什么我会在第二行之前得到第一行的输出。我更新了questin。 – 2014-09-04 15:01:08

+0

查看我的更新回答 – imran 2014-09-04 15:12:31

0

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

+0

我已经更新了代码。第一行执行后,cout只有字符串。根据定义,它不应该将数据清空到终端,因为没有endl或\ n。但在第二行它等待用户,它​​打印第一行为什么如此? – 2014-09-04 15:04:39

相关问题