K& R的C编程语言:第1.5节字符输入和输出

时间:2014-04-03 19:01:35

标签: c input output

定义: 文本流是一个序列 字符分为几行;每行包含零个或多个字符,后跟换行符。该定义从K& R逐字逐句。

我正在阅读K& R C编程语言,我对输入和输出的发生方式感到有些困惑。所以我写了一个小程序来看它是如何工作的,这就是我得到的:

enter image description here

while循环获取一个字符并将其保存为char c然后执行 putchar(c)等等,直到我点击返回(结束文本流),让我困惑的部分是:当我输入文本流 {{1似乎没有工作(确实不会在循环的每次迭代中打印putchar(c)),但是一旦我点击返回,我就会收到我输入的内容。

我认为以下情况正在发生,但我希望有人可以确认或纠正它。一旦我在命令提示符的第一行执行c,它就会被设置为接收输入文本流(这不是程序的结果,而是命令提示符的结果当我在命令提示符中键入文本时,每个字符都被发送到"输出文本流"通过inputOutput.exe,但是直到我在键盘上返回后才能从命令提示符看到该流,此时命令提示符结束输入模式,然后它执行最后putchar(c)调用要在命令提示符上显示的当前输出文本流。如果这是正确的话,在我看来,代码清单本身由命令提示符的规则而不是C语言管理的方式,这是正确的吗?

2 个答案:

答案 0 :(得分:3)

这是输入上的行缓冲工件。许多控制台/程序执行此操作,有时甚至允许高级输入编辑。尝试将控制台/程序置于直接模式/无缓冲。

答案 1 :(得分:2)

putchar(c)没有立即显示屏幕上的字符是缓冲的原因。 你可以添加:

fflush(stdout);

之后

putchar(c);

并且输出会更有意义。

你也可以关闭缓冲,但通常你想要它。

你想要缓冲的原因是,如果你要写出大量的数据,那么C-runtime可以更快地缓冲文本并将其一次性清除(或者缓冲区中的缓冲区)时间)。

C中的UI类型程序是正常的:

printf(... printing things);
printf(... printing some more things);
...
fflush(stdout); /* at this point everything will be seen by user */