使用boost :: iostreams :: filtering_stream的双向压缩流

时间:2018-02-02 11:36:10

标签: c++ boost gzip iostream

是否可以使用boost::iostreams::filtering_stream创建双向压缩流?我希望有一个我可以读写的对象,并且在读入和写入时将数据压缩/解压缩。我希望以下内容可以正常工作,但有些东西显然不对 - 在GCC上它抛出,在MSVC上它不会抛出但是错误位在流上设置。

Example on Coliru

#include <iostream>
#include <sstream>
#include <boost/iostreams/combine.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_stream.hpp>

int main()
{
    try
    {
        namespace bio = boost::iostreams;
        std::stringstream stream;

        bio::filtering_stream<bio::bidirectional> combined;
        combined.push(bio::combine(boost::iostreams::gzip_decompressor(), boost::iostreams::gzip_compressor()));
        combined.push(stream);

        combined << "some data" << 42 << 1.23456;

        std::string test;
        combined >> test;
        std::cout << test;
    }
    catch(std::exception& e)
    {
        std::cerr << "Error: " << e.what() << '\n';
    }
}

这根本不可能吗?有这种便利是有用的,但如果需要,我可以将读/写部分分成单独的操作。我猜我需要在任何写操作之前调用flush(),但不确定它是如何包装到单个对象中的。

0 个答案:

没有答案