为什么当我们从用户那里获取输入时需要一个缓冲区?
例如:
chat arr[10];
cin>>arr;
// or
cin.get(arr,10);
我读到有一个名为 buffer 的临时变量,用于存储用户键入的输入。所以:
编译器是否仅在 char 数组的情况下使用缓冲区?如果答案是否定的,那么什么时候使用它?
编译器在上面的示例中使用缓冲区的原因是什么?
如果上面示例中的缓冲区是一个数组,编译器如何选择其大小?
最佳答案
出于各种原因,涉及多个中间缓冲区:
操作系统有一个内部缓冲区。这在一定程度上取决于输入 设备:从磁盘的物理读取是按扇区进行的,因此缓冲区 必须使用扇区大小的倍数;键盘输入是 通常缓冲到换行符为止,以允许有限的 编辑程度(退格键等);等等。这主要是 对应用程序透明,尽管这确实意味着即使 仅读取单个字符,直到用户读取才会返回 输入换行符。
istream使用的streambuf有一个缓冲区。这样做是为了 减少对操作系统的请求数量。该缓冲区的大小将 一般取决于streambuf的类型;
filebuf
通常是 针对平台文件 IO 进行了优化——足够大以有效 减少请求,但不要大到引起分页。在某些系统上, 对于某些类型的文件,filebuf
可能会替换其 带有文件内存映射的缓冲区。
streambuf 具有允许修改其缓冲区管理的函数 有些。然而,它们很少被使用;作者 图书馆的工作通常做得足够好,你做不到 轻松改进它。
关于 >>
运算符:此缓冲全部发生在较低的位置
等级。 >>
运算符(实际上是来自 istream
的所有输入)
将对单个字符或字符数组的请求转发到
流缓冲区。这种将字符的实际输入与
对它们的解析是 istream 设计的基础:istream
仅负责解析;它包含一个指向streambuf的指针
它负责实际的输入。 (一些解析函数
还可能包含缓冲区。例如,int
的 >>
可能会收集
开始实际转换之前缓冲区中的数字序列。)
关于c++ - 当我们从用户那里获取输入时,为什么需要一个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328661/