2011-06-02 23 views
10

我有一些C++代码,使用cout语句出于调试目的,出于某种原因,我无法获得所有数据打印,除非我在最后做了std::cout.flush();标准输出并需要刷新它C++

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

任何人有任何见解?

+0

请不要编辑我的问题,谢谢。 – 2015-09-16 11:44:17

回答

7

要添加到其他的答案:你的调试语句应该改为去cerr,因为:

  • 其写入标准错误,这意味着,运行的应用程序,你可以很容易分开“正常“通过重定向从错误/调试信息输出程序;
  • 最重要的是,通过cerr默认为无缓冲,这意味着,每个输出操作之后,它会自动刷新,并且通常这是所希望的错误,并调试输出。

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

+0

谢谢,我会记住这个以供将来参考,我通常不关心,因为我会删除我的cout陈述,但这个项目是一个皇家的痛苦。我讨厌第三方代码。 – 2011-06-02 13:03:47

4

是不会自动得到刷新缺乏\n末的数据?默认情况下,只有在看到回车符后才能交付标准输出。

+0

如果我发送一个endl它也会打印,但我认为在C++中,它与flush操作相同? – 2011-06-02 12:45:54

+0

如果您愿意,回车将用作“冲洗点”。请记住,C与C++和C缺乏endl的底层I/O共享相同,但是\ n仍然有这个技巧。 std :: endl可能实际上强制刷新;我需要检查它的执行情况(或者听到有人确认)。 – mah 2011-06-02 12:49:40

+1

这是错误的。标准输出是*非*行缓冲。在涉及缓冲的地方,“iostream”与“FILE”的工作方式大不相同。 'std :: cout'将通过对'flush'(包括由'std :: endl'触发的或由'std :: cin'上的读取触发)或者在由实现决定的其他未指定时间的显式调用。 'iostream'没有行缓冲。 – 2011-06-02 13:03:46

1

“当你发送并输出到流,但它未必会立即打印,而是可以在缓冲等待,直到某个不确定的事件,如缓冲区满就够了,从输入,或从程序退出阅读。详细可能会有所不同。”

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

+0

因此,这意味着输出可能是不可预知的,我真的没有错误或流中的死锁? – 2011-06-02 12:46:58

+0

没错。冲洗它以获得充分的可预测性。 :) – 2011-06-02 12:47:55

0

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

9

您使用std::endl终止你的线条。这应该是 通常的做法,直到性能问题需要,但对于一些 的原因,我看到很多代码使用'\n'来代替。

否则,你总是可以做:

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

main的第一件事情之一。这将导致在 年底每<<,这是比你更需要冲洗,但对诊断 输出到控制台,可能是完全可以接受的。

+0

是的,我做的习惯,但我正在整合的一些代码并没有,这对我来说“纠正”它是相当大的。 – 2011-06-02 13:01:48

+0

@Dixon钢我知道这种感觉。这就是为什么我使用'unitbuf'提出第二个建议。 – 2011-06-02 13:15:57

0

,如果你想一回std::endl答案是唯一有效的。 不知道如果你想刷新命令提示符,你会怎么做。

相关问题