【问题标题】:"printf" doesn't print a string immediately [duplicate]“printf”不会立即打印字符串[重复]
【发布时间】:2012-08-22 08:50:15
【问题描述】:

可能重复:
Why does printf not flush after the call unless a newline is in the format string? (in C)

我有这样的代码:

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

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

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

【问题讨论】:

    标签: c printf


    【解决方案1】:

    默认情况下,输出流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 here 的文档。

    【讨论】:

    • fflush() 是我正在寻找的!谢谢!
    【解决方案2】:

    stdout 的输出是缓冲的,所以添加

    fflush(stdout); 
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多