istream :: tellg () возвращает -1 при использовании с моим пользовательским классом streambuf? - PullRequest
5 голосов
/ 20 июля 2011

Я пытаюсь создать 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 Ответ

6 голосов
/ 20 июля 2011

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

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

...