【问题标题】:How does copying input to output program work?将输入复制到输出程序如何工作?
【发布时间】:2013-10-14 11:10:50
【问题描述】:
#include <stdio.h>
main()
{
    int c;
    c = getchar();
    while(c != EOF)
        {
        putchar(c);
        c = getchar();
        }
    return 0;
}

如何将输入复制到输出程序? 根据我在开始时第一次 getchar() 执行它返回一个字符值并将其存储在 c 变量中。 现在,当执行循环时,编译器会检查 c 是否等于 EOF,如果发现它不等于,则循环开始工作并读取下一条语句,现在它执行 putchar() “当时为什么编译器不打印存储在c 变量而不是首先编译器读取所有字符然后打印这些字符“为什么?

【问题讨论】:

  • 为什么编译器不打印存储在 c 变量中的值而不是首先这样做...这就是putchar(c); 所做的。
  • 它没有回答,我想要 putchar(c) 怎么做??
  • 您的问题不是很清楚,但我相信我现在明白了,并将在下面提供正确答案而不是此处的评论。
  • 猜测:输出被缓冲。在 putchar 后添加fflush(stdout);

标签: c


【解决方案1】:

如果我对您的理解正确,您的意思是在程序运行时您看不到单个 putchar(c); 调用在执行时的结果。相反,您会看到输出集中在一起。您说您只在“最后”看到所有内容,但我怀疑您实际上在按下回车时每行都看到了所有内容。

到终端的正常标准输出缓冲要写入的字符。也就是说,当您输出某些内容时,该输出不会被传递到系统进行实际输出,直到缓冲区被刷新的某个点。在这种情况下,回车(行尾)将刷新缓冲区;尝试从同一通道读取输入将刷新缓冲区,关闭通道(退出程序)将刷新缓冲区。这样做的目的是提高性能,因为仅打印单个字符非常慢,而打印整个缓冲区的速度几乎相同(执行一次,而不是每个字符一次)。

如果您想手动刷新标准输出缓冲区,您可以在调用 putchar 之后包含 fflush(stdout);

或者,您可以通过 setvbuf(stdout, NULL, _IONBF, 0); 完全禁用缓冲

编辑:正如@JonatanGoebel 指出的那样,getchar(); 调用和输入通道也存在缓冲情况。你不能只刷新那个通道,但你可以禁用它的缓冲。如果它仍然处于缓冲状态,则输入将不会进入您的程序,直到其中包含回车(此时,每个连续的 getchar() 将返回缓冲区中的下一个字符,直到您用尽它,然后调用必须等待下一个要填充的缓冲区)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2011-09-25
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多