istream::tellg() возвращает -1 при использовании с моим пользовательским классом streambuf?

Я пытаюсь создать istream который читает непосредственно из буфера сырой памяти.

Я нашел хороший способ сделать это в другом посте здесь:

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

Тогда я создаю свой istream используя это membuf:

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

Затем я читаю, используя getline() а также >> операторы и все замечательно. Тем не менее, я не могу использовать seekg() перемотать назад к началу моего буфера, и istream::tellg() всегда возвращается -1,

Нужно ли писать еще код, чтобы заставить их работать, или это обречено на провал?

1 ответ

Решение

Функции tellg и seekg зависят от защищенных виртуальных функций seekoff а также seekpos, что вы должны были бы реализовать в своем membuf учебный класс.

Значения по умолчанию в basic_streambuf просто возвращается pos_type(off_type(-1)) для всех вызовов (который может быть равен -1 для многих реализаций).

Другие вопросы по тегам