我有一些C++代码,使用cout
语句出于调试目的,出于某种原因,我无法获得所有数据打印,除非我在最后做了std::cout.flush();
。标准输出并需要刷新它C++
我不太明白为什么需要这种刷新操作。
任何人有任何见解?
我有一些C++代码,使用cout
语句出于调试目的,出于某种原因,我无法获得所有数据打印,除非我在最后做了std::cout.flush();
。标准输出并需要刷新它C++
我不太明白为什么需要这种刷新操作。
任何人有任何见解?
要添加到其他的答案:你的调试语句应该改为去cerr
,因为:
cerr
默认为无缓冲,这意味着,每个输出操作之后,它会自动刷新,并且通常这是所希望的错误,并调试输出。(来源:C++标准,§27.3.1¶4-5,§27.4.2.1.2表83)
谢谢,我会记住这个以供将来参考,我通常不关心,因为我会删除我的cout陈述,但这个项目是一个皇家的痛苦。我讨厌第三方代码。 – 2011-06-02 13:03:47
是不会自动得到刷新缺乏\n
末的数据?默认情况下,只有在看到回车符后才能交付标准输出。
如果我发送一个endl它也会打印,但我认为在C++中,它与flush操作相同? – 2011-06-02 12:45:54
如果您愿意,回车将用作“冲洗点”。请记住,C与C++和C缺乏endl的底层I/O共享相同,但是\ n仍然有这个技巧。 std :: endl可能实际上强制刷新;我需要检查它的执行情况(或者听到有人确认)。 – mah 2011-06-02 12:49:40
这是错误的。标准输出是*非*行缓冲。在涉及缓冲的地方,“iostream”与“FILE”的工作方式大不相同。 'std :: cout'将通过对'flush'(包括由'std :: endl'触发的或由'std :: cin'上的读取触发)或者在由实现决定的其他未指定时间的显式调用。 'iostream'没有行缓冲。 – 2011-06-02 13:03:46
“当你发送并输出到流,但它未必会立即打印,而是可以在缓冲等待,直到某个不确定的事件,如缓冲区满就够了,从输入,或从程序退出阅读。详细可能会有所不同。”
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
因此,这意味着输出可能是不可预知的,我真的没有错误或流中的死锁? – 2011-06-02 12:46:58
没错。冲洗它以获得充分的可预测性。 :) – 2011-06-02 12:47:55
这是正确的行为。您可能使用std::endl
添加\n
并刷新缓冲区。 http://www.cplusplus.com/reference/ostream/endl/
您需要刷新流,如果你想看到的输出。
在C++中,您可以使用endl
格式化程序与cout
运算符而不是flush
。
您使用std::endl
终止你的线条。这应该是 通常的做法,直到性能问题需要,但对于一些 的原因,我看到很多代码使用'\n'
来代替。
否则,你总是可以做:
std::cout.setf(std::ios_base::unitbuf);
为main
的第一件事情之一。这将导致在 年底每<<
,这是比你更需要冲洗,但对诊断 输出到控制台,可能是完全可以接受的。
是的,我做的习惯,但我正在整合的一些代码并没有,这对我来说“纠正”它是相当大的。 – 2011-06-02 13:01:48
@Dixon钢我知道这种感觉。这就是为什么我使用'unitbuf'提出第二个建议。 – 2011-06-02 13:15:57
,如果你想一回std::endl
答案是唯一有效的。 不知道如果你想刷新命令提示符,你会怎么做。
请不要编辑我的问题,谢谢。 – 2015-09-16 11:44:17