【问题标题】:How to turn off buffering of stdout in C如何在 C 中关闭标准输出的缓冲
【发布时间】:2011-10-24 13:50:29
【问题描述】:

我想关闭标准输出的缓冲以获得以下代码的准确结果

while(1) {
printf(".");
sleep(1);
}

代码 printf 一堆 '.'仅当缓冲区被填满时。

【问题讨论】:

标签: c


【解决方案1】:

您可以使用setvbuf function:

setvbuf(stdout, NULL, _IONBF, 0);

以上链接已失效。这是该函数的另一个链接。

【讨论】:

  • 好一个。谢谢。顺便说一下setbuf(stream, NULL); 等价于setvbuf(stream, NULL, _IONBF, BUFSIZ);
  • 一个警告:在对流执行任何输入或输出之前,调用setbufsetvbuf 作为流的第一个 操作是唯一合法的。因此,明确地使用fflush 通常是一个更好的主意。
【解决方案2】:

你也可以使用 setbuf

setbuf(stdout, NULL);

这将解决所有问题

【讨论】:

  • 这不是一个很好的答案,引用Newlib:Both ANSI C and the System V Interface Definition (Issue 2) require <<setbuf>>. However, they differ on the meaning of a <<NULL>> buffer pointer: the SVID issue 2 specification says that a <<NULL>> buffer pointer requests unbuffered output. For maximum portability, avoid <<NULL>> buffer pointers.
  • @MightyPork Newlib 完全是错误The POSIX 2 specification for setbuf() 声明:“setvbuf(stream, buf, _IONBF, BUFSIZ) 如果 buf 是空指针。” _IONBF means unbufferedPOSIX 7the C standard 都同意,并且已经同意decades
【解决方案3】:

使用fflush(FILE *stream)stdout 作为参数。

http://www.elook.org/programming/c/fflush.html

【讨论】:

  • 这不会关闭缓冲,它会刷新一次缓冲区。
【解决方案4】:

你可以这样做:

write(1, ".", 1);

而不是这个:

printf(".");

【讨论】:

  • 使用STDOUT_FILENO
【解决方案5】:

使用fflush(stdout)。您可以在每次调用 printf 后使用它来强制刷新缓冲区。

【讨论】:

  • 这并没有真正“关闭 C 中标准输出的缓冲”。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-08-29
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多