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

Why do we need a buffer when we get input from the user?

本文关键字:我们 缓冲区 一个 输入 用户 那里 为什么      更新时间:2023-10-16

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

例如:

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

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

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

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

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

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

  1. 操作系统有一个内部缓冲区。 这在一定程度上取决于输入设备:从磁盘的物理读取是按扇区进行的,因此缓冲区是必须使用的扇区大小的倍数;键盘输入为通常缓冲到换行符,以允许有限的编辑程度(退格等);等等。 这主要是对应用程序透明,尽管这确实意味着即使只读取单个字符,直到用户才会返回读取输入换行符。

  2. istream 使用的 streambuf 有一个缓冲区。 这样做是为了减少对操作系统的请求数。 此缓冲区的大小将通常取决于流的类型;filebuf通常是针对平台文件 IO 进行了优化 — 足够大,可以有效地减少请求,但不要大到引起分页。 在某些系统上,对于某些类型的文件,filebuf可能会替换其具有文件内存映射的缓冲区。

streambuf 具有允许修改其缓冲区管理的功能有点。 但是,很少应该使用它们;作者的图书馆通常做得足够好,你不能轻松改进它。

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

必须有一些地方来存储输入(从外部收集的数据)。 缺乏这一点,很难理解为什么要进行输入。

即使对于其他数据类型——最清楚的是保存在intlongfloat中的数字(称为标量类型)——也必须声明一个变量来分配足够的存储空间来存储结果:

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

编译器不会选择其大小。 你必须声明它;通常可以将其设置得太大,但是将其设置得太小可能会导致多种问题。