【问题标题】:istream::tellg() returns -1 when used with my custom streambuf class?istream::tellg() 与我的自定义 streambuf 类一起使用时返回 -1?
【发布时间】:2011-10-09 11:16:42
【问题描述】:

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

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

  class membuf : public basic_streambuf<char>
  {
  public:
      membuf(char* p, size_t n) {
          setg(p, p, p + n);
      }
  };

然后我使用这个membuf 创建我的istream

    membuf mb(dataPointer, dataLength);
    istream reader(&mb);

然后我使用getline()&gt;&gt; 运算符阅读,一切都很棒。但是,我似乎无法使用seekg() 倒回到缓冲区的开头,并且istream::tellg() 总是返回-1

我是否需要编写更多代码才能使这些工作正常运行,还是注定要失败?

【问题讨论】:

  • 知道seekg()没有倒带吗?您是否证明tellg() 工作正常?
  • 是的,在调用 seekg(0) 之后,getline() 不会读取我的第一行。 tellg() 函数肯定不起作用,因为它总是返回 -1,(即使我刚开始从缓冲区读取)。我相信博的答案是去这里的路......
  • E@dSanville:好的;我相应地澄清了你的问题。

标签: c++ istream streambuf


【解决方案1】:

tellg 和 seekg 函数依赖于受保护的虚函数 seekoffseekpos,您必须在 membuf 类中实现它们。

basic_streambuf 中的默认值只为所有调用返回pos_type(off_type(-1))(对于许多实现可能等于 -1)。

【讨论】:

  • 非常感谢!我将立即实施这些。不过我很好奇, istream::tellg() 如何使用这些功能?是否调用streambuf::seekoff(0, ios_base::cur) 并获取返回值?
  • 实际上,是的。它实际上调用了 pubseekoff,然后调用了 seekoff,但这是一个界面设计细节。 :-)
  • 我正在尝试这样做...在自定义 membuf 类上实现 seekoffseekpos,除非我的代码中有问题:seekoff 没有被 @987654329 一致调用@ 和 seekpos 根本没有被调用。有什么建议或工作示例吗?
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多