stdout并需要刷新它C ++

时间:2011-06-02 12:40:36

标签: c++ stdout flush

我有一些C ++代码使用cout语句进行调试,出于某种原因,除非我在最后执行std::cout.flush();,否则我无法获取所有数据。

我不太明白为什么需要这种刷新操作。

任何人都有见解?

7 个答案:

答案 0 :(得分:11)

要添加其他答案:您的调试语句应改为cerr,因为:

  • 它写入标准错误,这意味着,运行应用程序,您可以通过重定向轻松地将“正常”程序输出与错误/调试信息分开;
  • 最重要的是,cerr默认为 无缓冲 ,这意味着,在每次输出操作后,它会自动刷新自身,通常这是对于错误和调试输出是可取的。

(来源:C ++标准,§27.3.1¶4-5,§27.4.2.1.2表83)

答案 1 :(得分:9)

您是否使用std::endl来终止您的线路。这应该是 通常的做法,直到性能问题要求,但对某些人来说 原因,我看到很多代码使用'\n'代替。

否则,您可以随时执行:

std::cout.setf( std::ios_base::unitbuf );

main中的第一件事。这将导致冲洗 每个<<的结尾,这比你需要的多,但是用于诊断 输出到控制台,可能是完全可以接受的。

答案 2 :(得分:4)

最终没有自动刷新的数据是否缺少\n?默认情况下,直到看到回车符才会传递标准输出。

答案 3 :(得分:1)

“当您将输出发送到流时,它不一定立即打印。相反,它可能会在缓冲区中等待,直到某些未指定的事件,例如缓冲区已满,从输入读取或退出程序。详细信息可能变化“。

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

答案 4 :(得分:0)

这是正确的行为。您可能使用添加std::endl的{​​{1}}并刷新缓冲区。 http://www.cplusplus.com/reference/ostream/endl/

如果要查看输出,则需要刷新流。

答案 5 :(得分:0)

在C ++中,您可以将endl格式化程序与cout运算符一起使用,而不是flush

答案 6 :(得分:0)

std::endl的答案仅在您想要返回时才有效。 如果你想要刷新命令提示符,不知道如何做到这一点。