首页 > 解决方案 > 我应该何时覆盖 basic_streambuf::seekoff?

问题描述

我正在编写一个继承自标准std::streambuf接口的自定义二进制流缓冲区。此流缓冲区需要支持对外部内存块(不属于流)的写入和读取。到目前为止,我可以只重写underflowoverflow成员函数,它们调用setp,pbumpsetg正确的位置,处理逻辑以规避Microsoft 的 STL 仅接受偏移值的限制int(这会导致大对象出现问题),并且使用pptrand获取/设置一个字节gptr

这已经有一段时间了。最近,当尝试在另一个上下文中使用此类时,使用我的流缓冲区的输入流几乎立即进入失败状态。我意识到默认实现std::streambuf::seekoff是什么都不做并返回-1,这就是设置失败位的原因。我猜之前对流缓冲区的使用从未最终调用seekoff,而这没有引起注意。

在对其他人实现自定义流缓冲区的经验进行一些研究时,我很少看到seekoff(并且它是伴随的seekpos)被覆盖。Boost ASIO 的 basic_streambuf没有。这篇关于编写自定义流缓冲区的文章和这篇其他文章(都出现在谷歌搜索的第一页上)没有。

basic_stringbuf不过,我确实看到了使用它的各种 STL 实现( MSVClibstdc++libc++)。

seekoff不实施and是错误的seekpos吗?根据我对流的理解,该实现basic_stringbuf有效地将调用转发到setgsetp使用正确的读/写指针,并且该实现应该适用于所有流。如果是这样,为什么这不是默认行为?xsgetn我知道它可能不是最佳的,但该标准确实为and提供了有效和非最佳的默认实现xsputn。我错过了什么?

标签: c++stlstream

解决方案


推荐阅读