是否有一种简单的方法来编写istream类以使用boost iostreams读取gzip文件?

时间:2018-07-22 14:05:11

标签: boost-iostreams

我想要一个类似于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());
    }
};

有人有什么建议吗?

0 个答案:

没有答案