假设我有一个输入操作:
file >> x;
如果 的内部缓冲区file
为空underflow()
,将调用将字符从外部设备导入 的内部缓冲区file
。如果在此刷新操作之后缓冲区将被部分或完全填充,则由实现定义。考虑到这一点,是否有可能如果x
是一个字符串并且我期望一个特定长度的输入值,那么缓冲区是否有权传输比这更少的字符?这会发生吗?
对于可用字符的数量没有真正的限制underflow()
。唯一真正的限制是尚未达到 EOF 的流需要至少使一个字符可用。具体而言std::filebuf
(或std::basic_filebuf<...>
),流可能是无缓冲的(如果setbuf(0, 0)
被调用),在这种情况下,它确实会使单个字符可用。否则,流将尝试填充其内部缓冲区并依赖操作系统让底层操作返回适当数量的字节(如果可用的字节数很少)。
我不确定我是否完全理解您的问题:操作file >> x
将在完全读取后返回一次x
,如果 指示的流file
已到达其末尾或找到空白字符(如果使用“字符串”您的意思char*
是非- 存储的零值file.width()
也被考虑在内)。对于底层流缓冲区,显然x
可能需要对底层表示进行多次读取,即,无法预测调用了多少次underflow()
。鉴于文件的内部缓冲区可能与磁盘的块大小匹配,我希望最多underflow()
对“正常”字符串进行一次调用。但是,如果读取的文件很大并且不包含任何空格,则许多调用underflow()
可以制作。鉴于流需要找到空格,它无法预测首先需要多少个字符。