“printf”不会立即打印字符串

6

可能有重复:
为什么printf在调用后不刷新,除非格式字符串中有换行符?(使用C语言)

我有这样一段代码:

printf("Starting nets allocation...");
while(...)
{
    ...some operations...
}
puts("DONE");

代码应该立即打印字符串“Starting nets allocation...”,然后在循环后打印“DONE”。

然而,程序首先执行循环,然后打印字符串“Starting nets allocation...DONE”。为什么会这样?我应该如何解决?

2个回答

13

默认情况下,输出流stdout是有缓冲区的,因此如果您想要立即输出,您需要刷新输出流 - 使用fflush - 或在printf中打印一个换行符:

printf("Starting nets allocation...");
fflush(stdout);    

或者:

printf("Starting nets allocation...\n");

请注意,您还可以使用stdio.h中的setbuf函数在文件指针级别上控制缓冲。
setbuf(stdout, NULL);

setbuf 的第二个参数是由调用者提供的缓冲区,用于将输出缓冲到流中。传递NULL表示禁用缓冲,并等效于:

setvbuf(stdout, NULL, _IONBF, 0);

该操作还会禁用指定流上的缓冲。

有关 setbuf 的文档,请参见此处


fflush() 就是我一直在寻找的!谢谢! - Andrea Sylar Solla
请您解释一下输出到stdout被缓冲是什么意思? - Mehdi Charife
1
嗨@MehdiCharife,对于回复晚了表示抱歉。像输入/输出这样的东西通常是“缓冲”的,意思是在处理之前数据会被收集到固定的存储区域中。这样可以更高效地操作字符缓冲区,而不是逐个字符执行操作。这只是缓冲的一个例子。https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BC%93%E5%86%B2 - pb2q

3

标准输出stdout是有缓冲的,因此需要添加

fflush(stdout); 

printf调用后需要刷新内容。通常情况下,添加换行符也会刷新缓冲区,但在某些情况下这可能不是理想的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接