c++ - 当我们从用户那里获取输入时,为什么需要一个缓冲区?

标签 c++ buffer cin

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

例如:

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

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

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

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

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

最佳答案

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

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

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

streambuf 具有允许修改其缓冲区管理的函数 有些。然而,它们很少被使用;作者 图书馆的工作通常做得足够好,你做不到 轻松改进它。

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

关于c++ - 当我们从用户那里获取输入时,为什么需要一个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328661/

相关文章:

c++ - 将所有方法放在类定义中

iphone - 调整 AudioUnit 缓冲区的长度

buffer - AVPlayer 的默认缓冲区大小是多少?

c++ - 使用 'unsigned int' 读取 'cin'

c++ - 如何在我的 C 版 Tic Tac Toe 中修复我的输入验证?

c++ - 读取通过 libcurl 下载的文件

c++ - 超过 1GB 的内存分配错误

c++ - 如何在 clang++ 中禁用自动 "pass by pointer"优化?

vim - 重命名 Vim 缓冲区,但不是内容

c++ - std::getline(std::cin, custom_class);类型不匹配