Получить istream из char *

У меня есть char * и длина данных, которые я получаю из библиотеки, и мне нужно передать данные функции, которая принимает istream.

Я знаю, что могу создать строковый поток, но он скопирует все данные. Кроме того, данные наверняка будут иметь нули, поскольку это zip-файл, и создание строкового потока будет принимать данные до первого 0, я думаю.

Есть ли способ создать поток istream из символа * и его размера без копирования всех данных?

51
задан marco.m 23 September 2015 в 04:29
поделиться

1 ответ

Расширение принятого ответа, который поддерживает tellg и seekg:

struct membuf : std::streambuf
{
    membuf(char* begin, char* end)
    {
        this->setg(begin, begin, end);
    }

    pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which = std::ios_base::in) override
    {
        if (dir == std::ios_base::cur)
            gbump(off);
        else if (dir == std::ios_base::end)
            setg(eback(), egptr() + off, egptr());
        else if (dir == std::ios_base::beg)
            setg(eback(), eback() + off, egptr());
        return gptr() - eback();
    }

    pos_type seekpos(pos_type sp, std::ios_base::openmode which) override
    {
        return seekoff(sp - pos_type(off_type(0)), std::ios_base::beg, which);
    }
};

Использование этого класса остается таким же.

0
ответ дан 7 November 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: