我想要一个类似于std :: istream的类,但是能够读取gzip文件。 有许多使用zlib代码的示例。但是,似乎对boost :: iostreams来说是微不足道的。
通过boost读取文件很容易
ifstream file("hello.gz", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(gzip_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);
但是我想要的是这样的:
my_gzstream in("hello.gz");
boost::iostreams::copy(in, cout);
其中“ in”具有正常的istream接口/行为等。 这是我到目前为止所拥有的,但是我并不特别喜欢它:
namespace io = boost::iostreams;
class my_gzstream : public std::istream {
std::unique_ptr<std::streambuf> _ptr_streambuf;
static io::filtering_istreambuf* make_streambuf(const std::string& file_path) {
auto p = std::make_unique<io::filtering_istreambuf>();
p->push(io::gzip_decompressor());
p->push(io::file_source(file_path, std::ios_base::in | std::ios_base::binary));
return p.release();
}
public:
my_gzstream(const std::string& file_path) :
std::istream(make_streambuf(file_path))
{
_ptr_streambuf.reset(this->rdbuf());
}
};
有人有什么建议吗?