c++ - 我应该何时覆盖 basic_streambuf::seekoff?
问题描述
我正在编写一个继承自标准std::streambuf
接口的自定义二进制流缓冲区。此流缓冲区需要支持对外部内存块(不属于流)的写入和读取。到目前为止,我可以只重写underflow
和overflow
成员函数,它们调用setp
,pbump
和setg
正确的位置,处理逻辑以规避Microsoft 的 STL 仅接受偏移值的限制int
(这会导致大对象出现问题),并且使用pptr
and获取/设置一个字节gptr
。
这已经有一段时间了。最近,当尝试在另一个上下文中使用此类时,使用我的流缓冲区的输入流几乎立即进入失败状态。我意识到默认实现std::streambuf::seekoff
是什么都不做并返回-1
,这就是设置失败位的原因。我猜之前对流缓冲区的使用从未最终调用seekoff
,而这没有引起注意。
在对其他人实现自定义流缓冲区的经验进行一些研究时,我很少看到seekoff
(并且它是伴随的seekpos
)被覆盖。Boost ASIO 的 basic_streambuf没有。这篇关于编写自定义流缓冲区的文章和这篇其他文章(都出现在谷歌搜索的第一页上)没有。
basic_stringbuf
不过,我确实看到了使用它的各种 STL 实现( MSVC、libstdc++、libc++)。
seekoff
不实施and是错误的seekpos
吗?根据我对流的理解,该实现basic_stringbuf
有效地将调用转发到setg
并setp
使用正确的读/写指针,并且该实现应该适用于所有流。如果是这样,为什么这不是默认行为?xsgetn
我知道它可能不是最佳的,但该标准确实为and提供了有效和非最佳的默认实现xsputn
。我错过了什么?
解决方案
推荐阅读
- json - pyspark - 读取 json 文件
- angular - 如何使用 Observable 存储状态管理以角度实现反应式编程?
- javascript - 如果对象数组中的值为假,如何返回具有布尔值的函数?
- javascript - Gulpfile 不适用于 import X from './X' statements
- security - SoftHSM V2 库文件?
- reactjs - React Material UI 条件渲染表格单元格颜色
- postgresql - repmgr 中未发生自动故障转移
- regex - 如何使用正则表达式查找给定单词之前是否存在单词?
- python-3.x - 无法为以前工作的脚本运行 pd.read_excel
- python - 按描述计算 pandas DataFrame 条目