17

连接到终端时,stdout 是行缓冲的,但我记得在某处读过(至少从 stdin 读取)会自动刷新 stdout。我使用过的所有 C 实现都做到了这一点,但我现在在标准中找不到它。

它以这种方式工作确实有意义,否则代码如下:

printf("Type some input: ");
fgets(line, sizeof line, stdin);

需要额外的fflush(stdout);

那么标准输出是否保证在这里被刷新?

编辑:

正如一些回复所说,标准中似乎不能保证在我的示例中输出到 stdout 将出现在从 stdin 读取之前,但另一方面,这个意图在(我的免费草稿副本)中说明标准:

交互设备的输入和输出动态应按照 7.19.3 中的规定进行。这些要求的目的是尽快出现无缓冲或行缓冲的输出,以确保在程序等待输入之前实际出现提示消息。

(ISO/IEC 9899:TC2 委员会草案——2005 年 5 月 6 日,第 14 页)。

所以似乎没有保证,但无论如何它可能会在大多数实现中工作。(著名遗言...)

4

6 回答 6

5

不,不是的。

于 2010-01-23T14:53:35.113 回答
5

要回答您的问题,您确实fflush(stdout);需要在通话后进行额外处理printf(),以确保在您的程序尝试读取输入之前出现提示。阅读stdinfflush(stdout);适合你。

于 2010-01-23T14:56:15.560 回答
4

不,你需要 fflush(stdout); 许多实现将在它们向终端发送输出的每个换行符处刷新。

于 2010-01-23T14:54:58.357 回答
4

没有标准输入/标准输出被缓冲。您需要明确地fflush(stdout)将视频内存/unix终端内存中的缓冲数据推送到终端等查看设备。可以通过调用来设置数据的缓冲setvbuf

编辑:感谢乔纳森,回答这个问题,从标准输入读取不会刷新标准输出。通过指定演示如何使用setvbuf.

  #包括

  诠释主要(无效)
  {
     文件*输入,*输出;
     字符缓冲区[512];

     输入 = fopen("file.in", "r+b");
     输出 = fopen("file.out", "w");

     /* 为最小的磁盘访问设置输入流,
        使用我们自己的字符缓冲区 */
     如果(setvbuf(输入,缓冲区,_IOFBF,512)!= 0)
        printf("为输入文件设置缓冲区失败\n");
     别的
        printf("为输入文件设置缓冲区\n");

     /* 使用空间为行缓冲设置输出流
        将通过对 malloc 的间接调用获得 */
     如果(setvbuf(输出,NULL,_IOLBF,132)!= 0)
        printf("设置输出文件缓冲区失败\n");
     别的
        printf("为输出文件设置缓冲区\n");

     /* 在此处执行文件 I/O */

     /* 关闭文件 */
     fclose(输入);
     fclose(输出);
     返回0;
  }

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-23T15:03:29.640 回答
2

不,这不是标准的一部分。您当然有可能使用了您描述的行为确实发生的库实现,但这是您不应该依赖的非标准扩展。

于 2010-01-23T15:05:46.127 回答
1

不会。在处理 std 流时,在 stdin 上读取或在 stdout 块上写入时,请注意进程间死锁。

于 2010-01-23T15:07:29.277 回答