我基于如此问题和答案所述的方法实现了以下内容:
struct membuf : std::streambuf
{
membuf(char* begin, char* end)
{
this->setg(begin, begin, end);
}
protected:
virtual pos_type seekoff(off_type off,
std::ios_base::seekdir dir,
std::ios_base::openmode which = std::ios_base::in)
{
std::istream::pos_type ret;
if(dir == std::ios_base::cur)
{
this->gbump(off);
}
// something is missing here...
}
};
我想在我的方法中以下面的方式使用它:
char buffer[] = { 0x01, 0x0a };
membuf sbuf(buffer, buffer + sizeof(buffer));
std::istream in(&sbuf);
然后在in
上调用tellg()
,就可以得到正确的结果。
到目前为止,这几乎是完美的 - 它不会在流的末尾停止。
我该如何更新它,使其正常工作呢?
我的主要动机是模仿std::ifstream
的行为,但在测试中使用二进制char[]
(而不是依赖于二进制文件)。
in.tellg()
并检查它是否小于我期望的“目标”位置。这会失败并在循环中读取比我想要的多一个元素。 - Patrykreturn gptr() - eback();
,现在它可以工作了 :) - Patryk