从stdin读取标准输出?

时间:2010-01-23 14:50:59

标签: c stdout stdin flush

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页)。

所以似乎没有保证,但无论如何它可能适用于大多数实现。 (着名的遗言......)

6 个答案:

答案 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流时注意进程间死锁。