现在的位置: 首页 > 综合 > 正文

缓冲区

2014年09月18日 ⁄ 综合 ⁄ 共 778字 ⁄ 字号 评论关闭

输入回显程序
#include <stdio.h>
int main(void)
{
   int ch;

   while((ch =  getchar()) != EOF)
   {
    putchar(ch);
   }
   return 0;
}
在大多数系统上运行该程序,在回显输入之前必须键入完整的一行。如:
Hello!
Hello!
My name is Jim.
My name is Jim.
而在有些系统中,您所输入的文本立即回显。如:
HHeelllloo!!
MMyy nnaammee iiss JJiimm..

输入字符的立即回显是非缓冲(unbuffered)或直接输入的一个实例,
它表示您所键入的字符对正在等待的程序立即变为可用。
相反,延迟回显是缓冲(buffered)输入的实例,这种情况下,
您所键入的字符被收集并存储在一个被称为缓冲区(buffer)的临时存储区域中。
按下回车键可使您所键入的字符块对程序变为可用。

为什么需要缓冲区?
首先,将若干个字符作为一个块传输比逐个发送这些字符耗费的时间少。
其次,如果您输入有误,就可以使用键盘更正功能来修正错误。当最终按下回车键时,就可以发送正确的输入。

那么非缓冲方式有什么用呢?
一些交互性的程序需要非缓冲输入。例如,在游戏中,您希望一按下键就执行某个命令。

缓冲分为两类:完全缓冲(fully buffered)I/O和行缓冲(line-buffered)I/O。
对完全缓冲输入来说,缓冲区满时被清空(内容被发送至目的地)。
这种类型的缓冲通常出现在文件输入中。
缓冲区的大小取决于系统,512byte和4096byte是常见的值。
对行缓冲I/O来说,遇到一个换行字符时将清空缓冲区。
键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。

ANSI C指定应该对输入进行缓冲,而K&R则将选择权留给了编译器的编写者。
您可以通过运行上面的输入回显程序来查明输入是否缓冲。

抱歉!评论已关闭.