У меня есть char * и длина данных, которые я получаю из библиотеки, и мне нужно передать данные функции, которая принимает istream.
Я знаю, что могу создать строковый поток, но он скопирует все данные. Кроме того, данные наверняка будут иметь нули, поскольку это zip-файл, и создание строкового потока будет принимать данные до первого 0, я думаю.
Есть ли способ создать поток istream из символа * и его размера без копирования всех данных?
Расширение принятого ответа, который поддерживает 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);
}
};
Использование этого класса остается таким же.