【发布时间】:2021-03-30 18:19:27
【问题描述】:
来自此堆栈溢出帖子:Is stdout line buffered, unbuffered or indeterminate by default?
从那篇文章中,它指出 “C99 标准没有指定三个标准流是无缓冲的还是行缓冲的:这取决于实现。”
#include <stdio.h>
int main(void) {
printf("Enter name: ");
fflush(stdout);
printf("Another name: ");
fflush(stdout);
return 0;
}
那么,这是否意味着我们每次打印,并且我们希望确保它对用户可见,每次都刷新它是最安全的选择?由于缓冲取决于实现?
#include <stdio.h>
int main(void) {
puts("Enter name:");
fflush(stdout);
puts("Another name: ");
fflush(stdout);
return 0;
}
即使在换行符上,每次刷新还是最好的吗?
我想 100% 确保用户看到输出,因此最好每次都刷新吗?即使在stderr?由于缓冲取决于实现?
【问题讨论】:
-
您不能 100% 确定(并且该标准并不试图保证)(1)有用户; (2)有输出装置; (3) 输出设备(如果存在)对用户可见(如果存在)。但是如果有一个用户和他们可见的交互式设备,并且如果该交互式设备附加到三个标准流,那么标准的意图是输出写入
stderr立即可见,写入stdout的输出在任何后续输入请求之前可见。不需要冲洗。 -
@rici 我也希望“标准的意图是......写入标准输出的输出在任何后续输入请求之前可见。”,但我没有找到 C 规范支持该声明。你知道吗?
-
@chux:第 5.1.2.3/6 节中明确的意图声明:“对一致实现的最低要求是:....交互式设备的输入和输出动态应按照 7.21 中的规定进行.3. 这些要求的目的是尽快出现无缓冲或行缓冲的输出,以确保在程序等待输入之前实际出现提示消息。”(Emph 补充)
-
@rici 谢谢。