当我们从用户那里获得输入时,为什么还需要缓冲区?

时间:2012-04-26 07:03:03

标签: c++ buffer cin

为什么我们从用户那里获得输入时需要一个缓冲区?

例如:

chat arr[10];
cin>>arr;
// or
cin.get(arr,10);

我读到有一个名为buffer的临时变量,用于存储用户输入的输入。所以:

  1. 编译器是否在char数组的情况下使用缓冲区?如果答案是“否”,那么何时使用?

  2. 上面示例中编译器使用缓冲区的原因是什么?

  3. 如果我上面例子中的缓冲区是一个数组,编译器如何选择它的大小?

2 个答案:

答案 0 :(得分:3)

由于各种原因,涉及几个中间缓冲区:

  1. 操作系统有一个内部缓冲区。这在某种程度上取决于输入 device:来自磁盘的物理读取是按扇区进行的,所以是缓冲区 是必须使用的扇区大小的倍数;键盘输入是 通常缓冲直到换行符,允许有限的 编辑程度(退格等);等等。这主要是 对应用程序透明,尽管它确实意味着即使在什么时候 只读一个字符,读取将不会返回,直到用户 输入换行符。

  2. istream使用的streambuf有一个缓冲区。这样就完成了 减少对OS的请求数量。这个缓冲区的大小会 一般取决于streambuf的类型;通常是filebuf 针对平台文件IO进行了优化 - 足够有效 减少请求,但不要大到诱导分页。在某些系统上, 对于某些类型的文件,filebuf可能会替换它 缓冲区,带有文件的内存映射。

  3. streambuf具有允许修改其缓冲区管理的功能 有些。然而,它们应该被使用是非常罕见的;作者 图书馆的工作一般都做得不够好 很容易改进它。

    关于>>运算符:此缓冲都发生在较低的位置 水平。 >>运算符(实际上来自istream的所有输入) 转发对单个字符或字符数组的请求 streambuf。这种角色的实际输入的解耦 解析它们是istream的设计的基础:istream 只负责解析;它包含指向streambuf的指针 它负责实际输入。 (一些解析功能 也可能包含缓冲区。例如,>>的{​​{1}}可能会收集 开始实际转换之前缓冲区中的数字序列。)

答案 1 :(得分:1)

必须存储输入的位置(从外部收集的数据)。由于缺乏这一点,很难理解为什么输入将会完成。

即使对于其他数据类型 - intlongfloat(称为标量类型)中最明显的数字 - 必须存在声明的变量,它分配足以存储结果的存储空间:

long  n;
double  d;
cin >> n;
cin >> d;

编译器不选择其大小。你必须申报;通常可以把它做得太大,但是把它做得太小会导致几种问题。

相关问题