读取stdin冲洗stdout吗?
当连接到终端时,stdout是行缓冲的,但我记得在某处阅读(至少从stdin)将自动刷新stdout。 我使用的所有C实现都已经完成了,但我现在无法在标准中找到它。
它确实有意义,它是这样的,否则代码是这样的:
printf("Type some input: "); fgets(line, sizeof line, stdin);
需要额外的fflush(stdout);
那么stdout保证会在这里刷新吗?
编辑:
正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:
交互设备的输入和输出动态应按照7.19.3的规定进行。 这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息。
(ISO / IEC 9899:TC2委员会草案 – 2005年5月6日,第14页)。
所以似乎没有保证,但无论如何它可能适用于大多数实现。 (著名遗言…)
要回答你的问题,你需要额外的fflush(stdout);
在printf()
调用之后,确保在程序尝试读取输入之前出现提示。 从stdin
读取不是fflush(stdout);
为了你。
不,不是的。
不,你需要fflush(stdout); 许多实现将在它们将输出发送到终端的每个换行符时刷新。
编号stdin / stdout是缓冲的。 您需要明确fflush(stdout)
,以便将video内存/ unix终端内存中的缓冲数据推送到视图设备(如终端)。 可以通过调用setvbuf
来设置数据的缓冲。
编辑:感谢Jonathan,回答这个问题,从stdin读取不会刷新stdout。 通过指定演示如何使用setvbuf
的代码,我可能已经在这里切断了。
#包括 int main(void) { FILE *输入,*输出; char bufr [512]; input = fopen(“file.in”,“r + b”); output = fopen(“file.out”,“w”); / *设置输入流以实现最小的磁盘访问, 使用我们自己的字符缓冲区* / if(setvbuf(input,bufr,_IOFBF,512)!= 0) printf(“无法为输入文件设置缓冲区\ n”); 其他 printf(“为输入文件设置缓冲区\ n”); / *使用空间设置用于行缓冲的输出流 将通过间接调用malloc * /获得 if(setvbuf(output,NULL,_IOLBF,132)!= 0) printf(“无法为输出文件设置缓冲区\ n”); 其他 printf(“缓冲区设置为输出文件\ n”); / *在这里执行文件I / O * / / *关闭文件* / FCLOSE(输入); FCLOSE(输出); 返回0; }
希望这会有所帮助,最好的问候,汤姆。
不,这不是标准的一部分。 您可能已经使用了一个库实现,其中您描述的行为确实发生了,但这是一个您不应该依赖的非标准扩展。
注意:当在stdin上读取或在stdout块上写入时,在处理std流时要注意进程间死锁。