Это определенно может быть сделано путем реализации буфера потоков фильтрации: вы бы взяли из std::streambuf
и взяли бы диапазон, который вы хотите выставить, и буфер базового потока (ну, указатель на него) в качестве аргументов. Тогда вы будете стремиться к месту старта. Переопределенная функция underflow()
считывает из буфера нижележащего потока в его буфер, пока не будет использовано столько символов, сколько необходимо. Вот несколько грубая и полностью не проверенная версия:
#include <streambuf>
struct rangebuf: std::streambuf {
rangebuf(std::streampos start,
size_t size,
std::streambuf* sbuf):
size_(size), sbuf_(sbuf)
{
sbuf->seekpos(start, std::ios_base::in);
}
int underflow() {
size_t r(this->sbuf_->sgetn(this->buf_,
std::min<size_t>(sizeof(this->buf_), this->size_));
this->size -= r;
this->setg(this->buf_, this->buf_, this->buf_ + r);
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
size_t size_;
std::streambuf* sbuf_;
};
Вы можете использовать указатель на экземпляр этого потокового буфера для инициализации std::istream
. Если это повторяется, вам может потребоваться создать класс, производный от std::istream
, вместо этого настраивая буфер потока.