我有一些使用cout
语句进行调试的C++代码,但不知何故,除非我在结尾处执行std::cout.flush();
,否则无法打印所有数据。
我不太理解为什么需要执行刷新操作。
有人有任何见解吗?
补充前面的答案:你的调试语句应该写到cerr
中,因为:
cerr
是不带缓冲的,这意味着在每次输出操作之后,它会自动刷新自己,通常这对于错误和调试输出是有益的。(来源:C++标准,§27.3.1 ¶4-5,§27.4.2.1.2 表 83)
你是否在使用std::endl
来结束每一行?这应该是常规做法,除非出于性能问题需要使用其他方式,但由于某些原因,我看到有很多代码使用'\n'
代替。
另外,你也可以这样做:
std::cout.setf( std::ios_base::unitbuf );
在 main
函数的最开始加入这一行。这样会导致在每个 <<
结尾处都进行刷新,这比你实际需要的更频繁,但对于向控制台输出诊断信息来说,可能是可以接受的。
unitbuf
。 - James Kanzestd::endl
作为常规做法? - 9769953\n
进行优化。但这应该被视为一种优化,而不是在性能不重要时的默认行为。) - undefined自动刷新不完全的数据是否缺少结尾的\n
?默认情况下,标准输出在看到回车符之前不会被传递。
iostream
的工作方式与 FILE
相比有很大不同。通过显式调用 flush
(包括由 std::endl
或 std::cin
的读取触发的调用),或者在其他由实现决定的未指定时间,std::cout
将被刷新。在 iostream
中没有行缓冲。 - James Kanze\r
标记后才得到修复。我真的无话可说。顺便说一下,据我所知,stdout应该在“换行符”而不是“回车符”上刷新。 - Hi-Angel当你向一个流输出时,并不一定会立即打印出来。相反,它可能会在缓冲区中等待某些未指定的事件,例如缓冲区充满足够、从输入读取或程序退出。具体细节可能会有所变化。
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
这是正确的行为。你可能使用了std::endl
,它会添加\n
并刷新缓冲区。http://www.cplusplus.com/reference/ostream/endl/
如果你想看到输出,你需要刷新流。
std::endl
的答案只在需要回车时才有效。
如果想要将命令提示符刷新,不确定该如何实现。