为什么我们从用户那里获得输入时需要一个缓冲区?
例如:
chat arr[10];
cin>>arr;
// or
cin.get(arr,10);
我读到有一个名为buffer的临时变量,用于存储用户输入的输入。所以:
编译器是否在char数组的情况下使用缓冲区?如果答案是“否”,那么何时使用?
上面示例中编译器使用缓冲区的原因是什么?
如果我上面例子中的缓冲区是一个数组,编译器如何选择它的大小?
答案 0 :(得分:3)
由于各种原因,涉及几个中间缓冲区:
操作系统有一个内部缓冲区。这在某种程度上取决于输入 device:来自磁盘的物理读取是按扇区进行的,所以是缓冲区 是必须使用的扇区大小的倍数;键盘输入是 通常缓冲直到换行符,允许有限的 编辑程度(退格等);等等。这主要是 对应用程序透明,尽管它确实意味着即使在什么时候 只读一个字符,读取将不会返回,直到用户 输入换行符。
istream使用的streambuf有一个缓冲区。这样就完成了
减少对OS的请求数量。这个缓冲区的大小会
一般取决于streambuf的类型;通常是filebuf
针对平台文件IO进行了优化 - 足够有效
减少请求,但不要大到诱导分页。在某些系统上,
对于某些类型的文件,filebuf
可能会替换它
缓冲区,带有文件的内存映射。
streambuf具有允许修改其缓冲区管理的功能 有些。然而,它们应该被使用是非常罕见的;作者 图书馆的工作一般都做得不够好 很容易改进它。
关于>>
运算符:此缓冲都发生在较低的位置
水平。 >>
运算符(实际上来自istream
的所有输入)
转发对单个字符或字符数组的请求
streambuf。这种角色的实际输入的解耦
解析它们是istream
的设计的基础:istream
只负责解析;它包含指向streambuf的指针
它负责实际输入。 (一些解析功能
也可能包含缓冲区。例如,>>
的{{1}}可能会收集
开始实际转换之前缓冲区中的数字序列。)
答案 1 :(得分:1)
必须存储输入的位置(从外部收集的数据)。由于缺乏这一点,很难理解为什么输入将会完成。
即使对于其他数据类型 - int
,long
和float
(称为标量类型)中最明显的数字 - 必须存在声明的变量,它分配足以存储结果的存储空间:
long n;
double d;
cin >> n;
cin >> d;
编译器不选择其大小。你必须申报;通常可以把它做得太大,但是把它做得太小会导致几种问题。