取消绑定cin和cout时,使用std :: endl vs“ \ n”

时间:2019-07-05 21:12:40

标签: c++ c++11 c++14

Fast I/O建议在编程比赛中使用以下两行代码来加快IO:

    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);  

我可以理解删除同步。但是在取消cin和cout的绑定后,如何确保缓冲区不会溢出,当我不使用std :: endl时,cin和cout可以正常工作而不会阻塞,并且可以正确刷新缓冲区。使用“ \ n”会自动处理吗?

1 个答案:

答案 0 :(得分:4)

  

如何确保缓冲区不会溢出

输出缓冲区不会“溢出”。装满后,它会自动刷新,即,将其内容写出,并将其长度重置为0。无论是否cin / cout被捆绑在一起,都是这种情况。

  

cin和cout可以正常工作而不会阻塞

您通常希望阻止cin / cout上的操作。但是同样,阻塞与非阻塞I / O与cin / cout是否绑定无关。

  

当我不使用std :: endl时,缓冲区会正确刷新。使用“ \ n”会自动处理吗?

仅在流处于行缓冲模式时才输出'\n'刷新缓冲区。如果输出到终端,cout会自动进入行缓冲模式;否则,它会被块缓冲(即,仅在其完全运行时才被刷新)。

在编程比赛中,cout通常进入管道或日志文件,因此它将被块缓冲,并且'\n'不会引起刷新。但是,在那种情况下,在读取输入之前是否显示提示也没关系(这是绑定cin / cout的正常使用情况)。只要确保您产生正确的输出,并让I / O库担心缓冲即可。当缓冲区运行满,关闭流并退出程序时,将自动刷新该缓冲区。没有输出丢失(除非您的程序崩溃,否则您还有其他事情要担心)。