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

标签 c++ istream streambuf

我正在尝试创建一个直接从原始内存缓冲区读取的 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()>>> 运算符阅读,一切都很棒。但是,我似乎无法使用 seekg() 返回缓冲区的开头,并且 istream::tellg() 总是返回 -1

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

最佳答案

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

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

关于c++ - istream::tellg() 在与我的自定义 streambuf 类一起使用时返回 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763646/

相关文章:

c++ - istream 在 while-switch 循环中崩溃

c++ - 标准流适配器

c++ - 将 std::cout 重定向到自定义编写器

c++ - 即使委托(delegate)仅添加到 QTableView,QListView 项目也显示委托(delegate)编辑器

c++ - winsock2线程安全吗?

c++ - ifstream.open() 不打开文件

c++ - 流缓冲区之间的 block 级数据复制

c++ - 错误 C2440 '=' : cannot convert from 'cli::array<Type> ^' to 'wchar_t'

c++ - 将 int 数组转换为 7bytes 变量

c++ - 如何确定 cin 是键盘还是来自文件