2

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

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

setbuf( stdout , NULL );

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

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

提前致谢!

4

3 回答 3

5

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

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

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

或者

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

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

于 2008-10-01T05:20:48.403 回答
5

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

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

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

另一个可能有趣的函数是tie

于 2008-10-01T06:09:48.630 回答
1

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

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

于 2008-10-01T13:57:29.067 回答