gpt4 book ai didi

c - 为什么在这段代码中没有打印任何换行符时缓冲区被刷新?

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:58 26 4
gpt4 key购买 nike

#include <stdio.h>
#include <limits.h>
#include <windows.h>

void p(int n) {

if (n == 0) return;

p(n/10);

if (n%10 < 5) {printf("%d",n%10); Sleep(1000);}

}

int main()
{
printf("%d\n",INT_MAX-1);

p(INT_MAX - 1);

return 0;
}

它应该一次打印所有内容,因为流是缓冲的,但它会分别打印数字。我在 windows 下使用 gcc。

最佳答案

在 C 中,流有三种可能的缓冲状态:

  • _IONBF - 无缓冲;角色应该尽快出现
  • _IOLBF - 行缓冲;字符应出现在换行符之后
  • _IOFBF - 完全缓冲;在流刷新之前不应出现字符

关于stdout的初始状态,C11 7.21.3/7不得不说:

As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.

由于流 在您的情况下是一种交互式设备,因此它们不能被完全缓冲。因此,stdout 可以是行缓冲的也可以是非缓冲的。我没有看到任何其他文本进一步缩小范围。

显然在您的系统上,它以非缓冲模式启动。

你可以设置行缓冲:

setvbuf(stdout, NULL, _IOLBF, 1024);

(我不太确定你应该为最后一个参数添加什么,但我认为这意味着它应该为该行使用 1024 字节的缓冲区;如果达到该限制则刷新)。

然而,当我在 MinGW-w64 4.9.2 上尝试此操作时,行缓冲的行为似乎与完全缓冲的行为相同。

我推测原因是因为此实现尽可能将功能重定向到 MSVC 运行时库,并且可能 MSVC 运行时不支持行缓冲。这可以解释为什么 gcc 决定默认为无缓冲,因为对于交互式程序来说,这比全缓冲更好。

关于c - 为什么在这段代码中没有打印任何换行符时缓冲区被刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com