【问题标题】:How to compress a file (gzip) using boost libraries in C++如何使用 C++ 中的 boost 库压缩文件 (gzip)
【发布时间】:2013-07-01 05:48:45
【问题描述】:

我正在尝试使用 boost 库 (gzip) 压缩文件。 这是一个简单的任务:假设我有文件 data.xml,我需要将它压缩为 data.xml.gz。我什至可以使用默认压缩值,没关系。

我尝试在 google 和 BOOST 页面中查找,但没有成功。

我有以下几点:

bool SyncFrequencyHistory::frequencyHistoryCompressFile(void)
{
    printf("\r\n===== ACTION: frequencyHistoryCompressFile =====\r\n");

    std::ifstream inStream(FREQUENCY_HISTORY_FILE, std::ios_base::in);
    std::ofstream outStream(FREQUENCY_HISTORY_FILE_GZIP, std::ios_base::out);
    boost::iostreams::filtering_streambuf<boost::iostreams::output> out;
    out.push(boost::iostreams::gzip_compressor());
    out.push(outStream);
    boost::iostreams::copy(in, out);

    return true;
}

FREQUENCY_HISTORY_FILE 包含 XML 文件的完整位置

FREQUENCY_HISTORY_FILE_GZIP 包含 XML.GZ 文件的完整位置

我知道几乎所有的代码都是错误的,但我不知道谁写的正确。

【问题讨论】:

  • 将 gzip 作为外部命令运行不是一个选项吗?
  • 运行这个会发生什么?

标签: boost compression gzip iostream


【解决方案1】:

基于以下tutorial,我相信你的代码应该是:

bool SyncFrequencyHistory::frequencyHistoryCompressFile(void)
{
    printf("\r\n===== ACTION: frequencyHistoryCompressFile =====\r\n");

    std::ifstream inStream(FREQUENCY_HISTORY_FILE, std::ios_base::in);
    std::ofstream outStream(FREQUENCY_HISTORY_FILE_GZIP, std::ios_base::out);
    boost::iostreams::filtering_streambuf< boost::iostreams::input> in;
    in.push( boost::iostreams::gzip_compressor());
    in.push( inStream );
    boost::iostreams::copy(in, outStream);

    return true;
}

基本上,你读取输入,压缩它并保存数据

【讨论】:

  • 谢谢!我要试试:)
  • 此代码将创建一个压缩数据的 zip 文件,而不是压缩文件。
【解决方案2】:

我已经解决了!我改成了 ZLIB 库。

#include <zlib.h>

(...)

gzFile fi = gzopen(FILENAME,"wb");
gzprintf(fi,"This is a string"\r\n");
gzclose(fi);

【讨论】:

    【解决方案3】:

    此代码有效,您只需为输出流指定二进制类型:std::ios_base::binary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2012-09-15
      • 2017-02-01
      • 2013-10-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多