setbuf()是否影响cout

Does setbuf() affect cout?

本文关键字:影响 cout 是否 setbuf      更新时间:2023-10-16

再一次,我的老师无法回答我的问题。我知道谁能…

所以,我从来没有真正学习过C。很明显,在C++中,我会一直使用cout语句。在最近的一次作业中,我的老师告诉我们一定要放

setbuf( stdout , NULL );

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

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

提前感谢!

默认情况下,iostreams和stdio是同步的。参考

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

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

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

两者的作用相同。(std::endl=打印结束线,然后冲洗。)

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

正如Chris所说,sync_with_stdio应该将未缓冲的stdout与未缓冲的cout绑定(默认情况下),但如果您所做的只是使用cout,而不是在stdout上使用setbuf,那么更好的选择是在rdbuf返回的指针上使用pubsetbuf。即:

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

另一个有趣的函数是tie。

通常,当立即看到输出很重要时,我们谈论的是复杂的高度可靠的财务程序,它必须将交易记录到硬盘上,然后才能将其实际发送给交易对手。或者,(更常见的情况)即使程序崩溃,我们也希望看到调试消息。

既然你在学习,我就认为你在处理第二个案子。在这种情况下,我的建议是使用stderr而不是stdout。默认情况下,它是无缓冲的,您可以将它与stdout分开重定向,将输出放在一个位置,将日志记录放在另一个位置。