C++ istream::tellg()与自定义streambuf类一起使用时返回-1?

C++ istream::tellg()与自定义streambuf类一起使用时返回-1?,c++,istream,streambuf,C++,Istream,Streambuf,我正在尝试创建一个直接从原始内存缓冲区读取的istream 我在这里的另一篇帖子中找到了一个很好的方法: class membuf : public basic_streambuf<char> { public: membuf(char* p, size_t n) { setg(p, p, p + n); } }; 然后我使用getline()和>操作符阅读,一切都很好。然而,我似乎无法使用seekg()倒回缓冲区的开头,

我正在尝试创建一个直接从原始内存缓冲区读取的
istream

我在这里的另一篇帖子中找到了一个很好的方法:

  class membuf : public basic_streambuf<char>
  {
  public:
      membuf(char* p, size_t n) {
          setg(p, p, p + n);
      }
  };
然后我使用
getline()
>
操作符阅读,一切都很好。然而,我似乎无法使用
seekg()
倒回缓冲区的开头,而
istream::tellg()
总是返回
-1


我是否需要编写更多的代码才能使这些功能正常工作,或者这注定会失败?

tellg和seekg函数依赖于受保护的虚拟函数
seekoff
seekpos
,这些函数必须在
membuf
类中实现


basic\u streambuf
中的默认值仅返回所有调用的
pos\u type(off\u type(-1))
(对于许多实现,这可能等于-1)。

您知道
seekg()
不是倒带吗?您证明了
tellg()
工作正常吗?是的,在调用seekg(0)之后,getline()不会读取我的第一行。tellg()函数肯定不起作用,因为它总是返回-1(即使我刚开始从缓冲区读取)。我相信薄熙来的答案是正确的。。。E@dSanville:好;我据此澄清了你的问题,非常感谢!我将立即实施这些措施。我很好奇,istream::tellg()是如何使用这些函数的?它是否调用streambuf::seekoff(0,ios_base::cur)并获取返回值?实际上,是的。它实际上调用了pubseekoff,然后pubseekoff调用了seekoff,但这是一个界面设计细节。:-)我正在努力做到这一点。。。在自定义membuf类上实现
seekoff
seekpos
,但我的代码中有一个问题:
seekoff
没有被
tellg
一致调用,并且根本没有调用
seekpos
。有什么建议或工作实例吗?
    membuf mb(dataPointer, dataLength);
    istream reader(&mb);