是否函数setbuf()影响清点?(Does setbuf() affect cout?)

2019-08-18 00:28发布

再一次,我的老师是不能回答我的问题。 我知道谁可能是能够...

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

setbuf( stdout , NULL );

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

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

提前致谢!

Answer 1:

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

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

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

要么

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

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



Answer 2:

默认情况下,如果标准输出或COUT被打印到控制台时,输出行缓冲。 这意味着,每一个被印刷换行符将刷新输出。 你可以明确地调用flush()时,你要重写的行为,以防万一说,输出将被重定向到一个文件,你想用尾巴-f和需要实时一定的输出。

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

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

这可能是有趣的,看看另一个功能是领带 。



Answer 3:

通常情况下,立即看到输出的时候是很重要的,我们谈论的是必须真正把它发送到对方之前一路日志交易到硬盘驱动器复杂的高度可靠的财务程序。 或者(更常见的情况),我们希望看到即使在程序崩溃调试消息。

既然你学习,我假设你正在处理的第二种情况。 在这种情况下,我的建议是使用标准错误而不是标准输出。 这是默认不缓冲,并且可以从标准输出重定向分开它,把在一个地方你的输出,而在另一个你的日志。



文章来源: Does setbuf() affect cout?