Я не использовал интерфейс libzip, но из того, что вы пишете, он выглядит очень похоже на файловый интерфейс: как только вы получили дескриптор потока, вы продолжаете вызывать zip_fread()
, пока эта функция не выдаст ошибку ( возможно, меньше запрошенных байтов). Буфер, который вы передаете нам, представляет собой временный буфер разумного размера, по которому передаются данные.
Лично я бы, вероятно, создал для этого потоковый буфер, чтобы после настройки файла в zip-архиве его можно было прочитать с использованием обычных потоковых методов ввода-вывода. Это будет выглядеть примерно так:
struct zipbuf: std::streambuf {
zipbuf(???): file_(???) {}
private:
zip_file* file_;
enum { s_size = 8196 };
char buffer_[s_size];
int underflow() {
int rc(zip_fread(this->file_, this->buffer_, s_size));
this->setg(this->buffer_, this->buffer_,
this->buffer_ + std::max(0, rc));
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
};
С помощью этого потокового буфера вы сможете создать std::istream
и считывать файл в любую нужную вам структуру:
zipbuf buf(???);
std::istream in(&buf);
...
Очевидно, этот код не проверен и не скомпилирован. Однако, когда вы заменяете ???
на то, что необходимо для открытия zip-файла, я думаю, что это должно сработать.