4

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

我有这样的代码:

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

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

相反,程序首先执行循环,然后打印字符串“Starting nets allocation...DONE”为什么会发生?我该如何解决这个问题?

4

2 回答 2

11

默认情况下,输出流stdout是缓冲的,所以如果你想要立即输出,你需要刷新输出流 - 使用fflush- 或在以下位置打印换行符printf

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

或者:

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

请注意,您还可以使用setbufstdio.h 中的函数在文件指针级别控制缓冲:

setbuf(stdout, NULL);

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

setvbuf(stdout, NULL, _IONBF, 0);

这也会禁用对指定流的缓冲。

请参阅setbuf 此处的文档。

于 2012-08-27T20:36:17.250 回答
3

输出到stdout被缓冲,所以添加

fflush(stdout); 

printf调用刷新内容之后。通常添加换行符也会刷新缓冲区,但在您的情况下可能不希望这样做。

于 2012-08-27T20:37:12.483 回答