假设我有一个输入操作:
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()
的调用次数被制成。鉴于文件的内部缓冲区可能与光盘的 block 大小相匹配,我希望最多调用一次 underflow()
是为“普通”字符串制作的。但是,如果读取的文件很大且不包含任何空格,则多次调用 underflow()
可能会被制作。考虑到流需要查找空格,它无法预测首先需要多少字符。
关于c++ - 缓冲区如何知道在刷新操作期间要从外部文件传输多少个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622086/