【发布时间】:2011-09-07 01:30:16
【问题描述】:
我有一些 C++ 代码使用 cout 语句进行调试,出于某种原因,我无法打印所有数据,除非最后执行 std::cout.flush();。
我不太明白为什么需要这个刷新操作。
有人有什么见解吗?
【问题讨论】:
-
请不要编辑我的问题,谢谢。
我有一些 C++ 代码使用 cout 语句进行调试,出于某种原因,我无法打印所有数据,除非最后执行 std::cout.flush();。
我不太明白为什么需要这个刷新操作。
有人有什么见解吗?
【问题讨论】:
这是正确的行为。您可能使用 std::endl 添加 \n 并刷新缓冲区。 http://www.cplusplus.com/reference/ostream/endl/
如果要查看输出,则需要刷新流。
【讨论】:
未自动刷新的数据最后是否缺少\n?默认情况下,在看到回车之前不会传送标准输出。
【讨论】:
iostream 的工作方式与FILE 大不相同。 std::cout 将通过对flush 的显式调用(包括由std::endl 或通过读取std::cin 触发的调用)或在由实现决定的其他未指定时间刷新。 iostream 中没有行缓冲。
\r 符号时,这才得到解决。我只是没有cmets。 @Mah,顺便说一句,据我所知,标准输出不应该在“回车”上刷新,而是在“换行”上。
在 C++ 中,您可以将endl 格式化程序与cout 运算符一起使用,而不是flush。
【讨论】:
std::endl 的答案只有在您想要退货时才有效。
如果您想刷新命令提示符,不确定如何执行此操作。
【讨论】:
补充其他答案:您的调试语句应该转到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。
“当您将输出发送到流时,它不一定会立即打印。相反,它可能会在缓冲区中等待,直到某些未指定的事件,例如缓冲区已满,从输入读取或退出程序。详细信息可能变化。”
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
【讨论】: