我有一些C ++代码使用cout
语句进行调试,出于某种原因,除非我在最后执行std::cout.flush();
,否则我无法获取所有数据。
我不太明白为什么需要这种刷新操作。
任何人都有见解?
答案 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
的答案仅在您想要返回时才有效。
如果你想要刷新命令提示符,不知道如何做到这一点。