setbuf()会影响cout吗?

时间:2008-10-01 04:49:54

标签: c++ class-library

然而,我的老师再也无法回答我的问题了。我知道谁可以......

所以,我从来没有真正学过C.在C ++中,我显然会一直使用cout语句。在最近的任务中,我的老师告诉我们确保放

setbuf( stdout , NULL );

位于main()的顶部,以获得无缓冲的输出,从而允许我们正确地查看输出。

我的问题是:这个语句会影响一个cout语句,还是只调用我调用的printf()语句?

提前致谢!

3 个答案:

答案 0 :(得分:6)

默认情况下,iostreams和stdio是同步的。 Reference.

这并不意味着手动调整stdio缓冲是一个好主意!您可能希望使用std::endlstd::flush(来自<ostream>),这可能会对您有所帮助。如,

std::cout << "Hello, world!" << std::endl;

std::cout << "Hello, world!\n" << std::flush;

这两个都做同样的事情。 (std::endl =打印结束,然后刷新。)

答案 1 :(得分:5)

默认情况下,如果stdout或cout正在打印到控制台,则输出是行缓冲的。这意味着每个打印的换行符都会刷新输出。您可以在想要覆盖行为时显式调用flush(),以防万一,输出将被重定向到文件,并且您想要使用tail -f并实时需要某些输出。

正如克里斯所说,sync_with_stdio应该将无缓冲的stdout与无缓冲的cout绑定(默认情况下),但如果您所做的只是使用cout,而不是在stdout上使用setbuf,则更好的选择是使用{关于pubsetbuf返回的指针的{3}}。即:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

另一个可能有趣的功能是rdbuf

答案 2 :(得分:1)

通常,当立即看到输出很重要时,我们谈论的是复杂的高可靠性财务例程,必须在将事务发送到交易对手之前将事务一直记录到硬盘驱动器。或者,(更常见的情况)我们希望即使在程序崩溃时也能看到调试消息。

既然你正在学习,我会假设你正在处理第二种情况。在这种情况下,我的建议是使用stderr而不是stdout。默认情况下它是无缓冲的,您可以将其与stdout分开重定向,将输出放在一个位置,然后登录到另一个位置。