c++ - 缓冲区如何知道在刷新操作期间要从外部文件传输多少个字符?

标签 c++ file buffer streambuf filebuf

假设我有一个输入操作:

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/

相关文章:

java - 打开的文件句柄太多

c - 关于C中文件流和缓冲区的问题

audio - 我想将输入节点的采样率从 44100 更改为 8000

javascript - 是什么使它成为在Web浏览器中打印1到1,000,000(以空格分隔)的最快的JavaScript?

c++ - std::unordered_map::reserve 是否保证只要映射中的元素较少就不会发生内存分配?

c++ - 对数组的引用与 C++ 中的数组名称完全相同

c++ - Windows 程序员 (C/C++) 的 Linux 编程有什么技巧吗?

c++ - QT 框架错误 : prototype for 'QtDownload::QtDownload(MainWindow)' does not match any in class 'QtDownload'

java - 是否可以将内存文件放入 Camel 管道中?

ios - cordova ios resolveLocalFileSystemURL 在cordova.file.applicationDirectory 中的ENCODING_ERR