为什么当我们从用户那里获得输入时我们需要一个缓冲区
Why do we need a buffer when we get input from the user?
为什么我们在从用户那里获得输入时需要一个缓冲区?
例如:
chat arr[10];
cin>>arr;
// or
cin.get(arr,10);
我读到有一个名为缓冲区的临时变量,用于存储用户键入的输入。所以:
编译器是否仅在 char 数组的情况下使用缓冲区?如果答案是否定的,那么什么时候使用?
在我上面的例子中,编译器使用缓冲区的原因是什么?
如果上面示例中的缓冲区是一个数组,编译器如何选择其大小?
出于各种原因,涉及几个中间缓冲区:
-
操作系统有一个内部缓冲区。 这在一定程度上取决于输入设备:从磁盘的物理读取是按扇区进行的,因此缓冲区是必须使用的扇区大小的倍数;键盘输入为通常缓冲到换行符,以允许有限的编辑程度(退格等);等等。 这主要是对应用程序透明,尽管这确实意味着即使只读取单个字符,直到用户才会返回读取输入换行符。
-
istream 使用的 streambuf 有一个缓冲区。 这样做是为了减少对操作系统的请求数。 此缓冲区的大小将通常取决于流的类型;
filebuf
通常是针对平台文件 IO 进行了优化 — 足够大,可以有效地减少请求,但不要大到引起分页。 在某些系统上,对于某些类型的文件,filebuf
可能会替换其具有文件内存映射的缓冲区。
streambuf 具有允许修改其缓冲区管理的功能有点。 但是,很少应该使用它们;作者的图书馆通常做得足够好,你不能轻松改进它。
关于>>
运算符:这种缓冲都发生在较低的水平。 >>
运算符(实际上是来自istream
的所有输入)将对单个字符或字符数组的请求转发到溪流。 这种字符的实际输入与解析它们是istream
设计的基础:istream
只负责解析;它包含一个指向流的指针它负责实际输入。 (一些解析函数也可能包含缓冲液。 例如,int
的>>
可能会收集开始实际转换之前缓冲区中的数字序列。
必须有一些地方来存储输入(从外部收集的数据)。 缺乏这一点,很难理解为什么要进行输入。
即使对于其他数据类型——最清楚的是保存在int
、long
和float
中的数字(称为标量类型)——也必须声明一个变量来分配足够的存储空间来存储结果:
long n;
double d;
cin >> n;
cin >> d;
编译器不会选择其大小。 你必须声明它;通常可以将其设置得太大,但是将其设置得太小可能会导致多种问题。
- C++字符*缓冲区的大小
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 我们可以访问一个不存在的联盟的成员吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- Xaudio2在更改缓冲区或循环时弹出声音
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 多线程双缓冲区
- 我们可以删除链表中静态内存中的节点吗
- 为什么我们必须在渲染过程中清除 OpenGL 中的深度缓冲区
- 为什么当我们从用户那里获得输入时我们需要一个缓冲区
- 为什么我们刷新流而不是缓冲区
- 协议缓冲区——我们可以从c++ protobuf消息包装器中获得.proto消息描述符吗?