如何在C中关闭stdout的缓冲

Sre*_*nat 32 c

我想关闭stdout的缓冲以获取以下代码的确切结果

while(1) {
printf(".");
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

代码printf一堆'.' 只有当缓冲区被填满时

Fre*_*abe 87

您可以使用setvbuf函数:

setvbuf(stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)

上面的链接已被破坏.这是该功能的另一个链接.

  • 需要注意的一点是:在对其执行任何输入或输出之前,将"setbuf"或"setvbuf"称为流上的**第一个**操作是合法的.因此明确地使用`fflush`通常是一个更好的主意. (14认同)
  • 好的.谢谢.顺便说一下`setbuf(stream,NULL);`相当于`setvbuf(stream,NULL,_IONBF,BUFSIZ);` (4认同)

Esw*_*nti 9

您也可以使用setbuf

setbuf(stdout, NULL);
Run Code Online (Sandbox Code Playgroud)

这将照顾一切

  • @MightyPork Newlib 完全是**错误**。[`setbuf()`的 POSIX 2 规范](https://pubs.opengroup.org/onlinepubs/7908799/xsh/setbuf.html) 指出:“`setvbuf(stream, buf, _IONBF, BUFSIZ)` if buf是一个空指针。” [`_IONBF` 表示无缓冲](https://port70.net/~nsz/c/c11/n1570.html#7.21.5.6p2) 两者都是 [POSIX 7](https://pubs.opengroup.org/onlinepubs/ 9699919799/functions/setbuf.html)和[C标准](https://port70.net/~nsz/c/c11/n1570.html#7.21.5.5)都同意,并且已经同意了[几十年](https ://port70.net/~nsz/c/c89/c89-draft.html#4.9.5.5)。 (3认同)

tde*_*ton -14

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

  • 这并没有真正“关闭 C 中标准输出的缓冲”。 (52认同)