2008-10-01 131 views
2

再次,我的老师无法回答我的问题。我知道谁可能是能够...setbuf()是否会影响cout?

所以,我从来没有真正学会C.在C++中,我会很明显,使用COUT声明所有的时间。在最近的一次任务,我的老师告诉我们,以确保把

setbuf(stdout , NULL); 

在顶部的main(),以获得无缓冲输出,从而使我们能够正确地看到输出。

我的问题是这样的:将本声明影响的cout语句,或者干脆一个printf()语句,我打电话?

在此先感谢!

回答

6

默认情况下,输入输出流和标准输入输出是同步的。 Reference.

这并不意味着手动调节标准输入输出缓冲是一个好主意,但!你可能希望利用std::endlstd::flush(来自<ostream>),这可能会对你有所帮助。例如,

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

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

这两个做同样的事情。 (std::endl =打印底线,然后冲洗。)

5

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

正如克里斯说,sync_with_stdio应配合无缓冲标准输出与缓冲COUT(默认),但如果你正在做的是使用COUT,而不是用在标准输出函数setbuf,更好的选择是对指针使用pubsetbufrdbuf返回。即:

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

另一个可能有趣的功能是看tie

1

通常,当立即看到输出很重要时,我们讨论的是复杂,高度可靠的金融例程,它必须将事务记录到硬盘中,然后才能将其发送给对方。或者,(更常见的情况下)我们希望即使在程序崩溃时也能看到调试消息。

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