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 для многих реализаций).