是否可以再次读取解压文件?
假设我使用archive_read_next_header(a, &entry)
了 ,并且我使用 读取了未知数量的字节archive_read_data(a, ptr_to_buffer, buffer_size)
。现在我想重置它并从头开始重新阅读。我试图覆盖seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which)
. 我知道,由于压缩算法的内部工作,可能无法仅在解压缩后的数据中寻找,并且数据不会存储在 libarchive 内部缓冲区中的有限字节数之外的任何地方。
这个想法是把它全部重置,然后读取std::streamoff off
字节,这样我就可以创建反向搜索。前向搜索很容易,只需读取std::streamoff off
字节。它确实效率低下,但让我们希望, seek 不会被太多使用。
整个结构archive
是这样初始化的:
archive_read_set_read_callback(a, read_callback);
archive_read_set_callback_data(a, container);
archive_read_set_seek_callback(a, seek_callback);
archive_read_set_skip_callback(a, skip_callback);
int r = (archive_read_open1(a));
其中 container 包含大部分std::istream
,而回调是操作该流的函数。
我想要实现的模板`
std::streampos seek_beg(std::streamoff off) {
if(off >= 0) {
// read/skip 'off' bytes
} else {
// reset (a)
// read/skip 'off' bytes
}
// return position
}
`
我的 underflow() 方法也是这样实现的:`
int underflow() {
int r = archive_read_data(ar, ptr, BUFFER_SIZE);
if (r < 0) {
throw std::runtime_error("ERROR");
} else if (r == 0) {
return std::streambuf::traits_type::eof();
} else {
setg(ptr, ptr, ptr + r);
}
return std::streambuf::traits_type::to_int_type(*ptr);
}
`