3

我想压缩我的程序的中间输出(在 C++ 中),然后解压缩它。

4

1 回答 1

11

您可以使用 Boost IOStreams 来压缩您的数据,例如沿着这些行压缩/解压缩到文件中/从文件中解压缩(示例改编自Boost 文档):

#include <fstream>
#include <iostream>

#include <boost/iostreams/filtering_stream.hpp>    
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

namespace bo = boost::iostreams;

int main() 
{
    {
    std::ofstream ofile("hello.gz", std::ios_base::out | std::ios_base::binary);
    bo::filtering_ostream out;
    out.push(bo::gzip_compressor()); 
    out.push(ofile); 
    out << "This is a gz file\n";
    }

    {
    std::ifstream ifile("hello.gz", std::ios_base::in | std::ios_base::binary);
    bo::filtering_streambuf<bo::input> in;
    in.push(bo::gzip_decompressor());
    in.push(ifile);
    boost::iostreams::copy(in, std::cout);
    }
}

您还可以查看 Boost Serialization - 它可以更轻松地保存您的数据。可以将这两种方法结合起来(示例)。IOStreams 也支持bzip压缩。

编辑:为了解决您的最后一条评论-您可以压缩现有文件...但最好将其写为压缩开始。如果你真的想要,你可以调整以下代码:

std::ifstream ifile("file", std::ios_base::in | std::ios_base::binary);
std::ofstream ofile("file.gz", std::ios_base::out | std::ios_base::binary);

bo::filtering_streambuf<bo::output> out;
out.push(bo::gzip_compressor());
out.push(ofile); 
bo::copy(ifile, out);
于 2012-04-14T18:33:30.500 回答