setbuf()是否会影响cout?
再一次,我的老师无法回答我的问题。我知道谁可能...
因此,我从来没有真正学习过C。显然,在C ++中,我会一直使用cout语句。在最近的作业中,我的老师告诉我们要确保
setbuf( stdout , NULL );
在main()的顶部以获取未缓冲的输出,从而使我们能够正确看到输出。
我的问题是:此语句会影响cout语句,还是仅影响我调用的printf()语句?
提前致谢!
解决方案
默认情况下,iostream和stdio是同步的。参考。
但这并不意味着手动调整stdio缓冲是个好主意!我们可能希望使用std :: endl
或者std :: 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。 IE:
// make cout unbuffered std::cout.rdbuf()->pubsetbuf(0, 0);
领带可能是另一个有趣的功能。
通常,当重要的是要立即查看输出时,我们所谈论的是复杂的高度可靠的财务例程,该例程必须将交易记录到硬盘驱动器,然后再将其实际发送到交易对手。或者,(更常见的情况)即使程序崩溃,我们也希望看到调试消息。
既然我们正在学习,我就假设我们正在处理第二种情况。在这种情况下,我的建议是使用stderr而不是stdout。默认情况下,它是无缓冲的,我们可以将其与stdout分别重定向,将输出放在一个地方,将日志记录在另一个地方。