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

bidirectional zipped stream using boost::iostreams::filtering_stream

提问人:DaveM 提问时间:2/2/2018 更新时间:2/2/2018 访问量:199

问:

是否可以使用 ?我想要一个可以读取和写入的对象,并在读取和写入数据时压缩/解压缩该数据。我希望像下面这样的东西会起作用,但显然有些不对劲 - 在 GCC 上它抛出,在 MSVC 上它不会抛出,但在流上设置了错误位。boost::iostreams::filtering_stream

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(),但不确定如何将其包装到单个对象中。

C++ 提升 gzip IOSTREAM

评论

1赞 sehe 2/2/2018
简短的回答,你不能。更长的答案是,如果你知道你的写作模式适合它,你可以设计一些“相似”的东西。这样做是相当复杂的。
0赞 sehe 2/2/2018
作为一个有用的入门提示,请参阅例如 stackoverflow.com/a/48391848/85371
0赞 DaveM 2/2/2018
这就是我的想法——或者至少它会是啰嗦的,而且相当严格。如果我决定解决这个问题,我会把它贴在这里。感谢您的帮助:)

答: 暂无答案