我想压缩我的程序的中间输出(在 C++ 中),然后解压缩它。
问问题
3135 次
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 回答