stdout在连接到终端时是行缓冲的,但是我记得在某处阅读(至少从stdin)将自动刷新stdout。我使用的所有C实现都已经完成了,但我现在无法在标准中找到它。
它的工作方式确实有意义,否则代码就像这样:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
需要额外的fflush(stdout);
那么stdout肯定会在这里刷新吗?
修改
正如几个回复所说,标准中似乎没有保证,我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图是在(我的免费草案副本)标准中说明:
输入和输出动态 交互设备应该发生 如7.19.3中所述。的意图 这些要求是无缓冲的 或行缓冲输出即将出现 尽可能确保提示 消息实际上出现在a之前 程序等待输入。
(ISO / IEC 9899:TC2委员会草案 - 2005年5月6日,第14页)。
所以似乎没有保证,但无论如何它可能适用于大多数实现。 (着名的遗言......)
答案 0 :(得分:5)
不,它没有。
答案 1 :(得分:5)
要回答您的问题, 在fflush(stdout);
调用后需要额外的printf()
,以确保在程序尝试读取输入之前出现提示。从stdin
阅读不会fflush(stdout);
给你。
答案 2 :(得分:4)
没有。你需要fflush(stdout);许多实现将在它们将输出发送到终端的每个换行符时刷新。
答案 3 :(得分:4)
没有。 stdin / stdout被缓冲。您需要明确fflush(stdout)
,以便将视频内存/ unix终端内存中的缓冲数据推送到视图设备(如终端)。可以通过调用setvbuf
来设置数据的缓冲。
编辑:感谢Jonathan回答这个问题,从stdin读取并不会刷新stdout。我可能通过指定演示如何使用setvbuf
的代码来解决这个问题。
#include int main(void) { FILE *input, *output; char bufr[512]; input = fopen("file.in", "r+b"); output = fopen("file.out", "w"); /* set up input stream for minimal disk access, using our own character buffer */ if (setvbuf(input, bufr, _IOFBF, 512) != 0) printf("failed to set up buffer for input file\n"); else printf("buffer set up for input file\n"); /* set up output stream for line buffering using space that will be obtained through an indirect call to malloc */ if (setvbuf(output, NULL, _IOLBF, 132) != 0) printf("failed to set up buffer for output file\n"); else printf("buffer set up for output file\n"); /* perform file I/O here */ /* close files */ fclose(input); fclose(output); return 0; }
希望这有帮助, 最好的祝福, 汤姆。
答案 4 :(得分:2)
不,这不是标准的一部分。您可能已经使用了一个库实现,其中您描述的行为确实发生了,但这是一个您不应该依赖的非标准扩展。
答案 5 :(得分:1)
没有。当在stdin上读取或在stdout块上写入时,在处理std流时注意进程间死锁。