boost :: iostreams :: gzip压缩器-crc错误?

时间:2018-11-01 11:10:01

标签: boost gzip

我正在使用以下代码将文件压缩为gzip文件。 创建的gzip文件已损坏

gzip -t:

invalid compressed data--crc error

我在做什么错了?

const char *filename = "/home/username/Desktop/temp/data.csv";
const char *gzFilename = "/home/username/Desktop/temp/data.csv.gz";

std::ifstream inStream(filename, std::ios_base::in);
std::ofstream outStream(gzFilename, std::ios_base::out | std::ios_base::binary);

boost_io::filtering_streambuf<boost_io::input> compressingBuf;
compressingBuf.push(boost_io::gzip_compressor());
compressingBuf.push(inStream);

boost_io::copy(compressingBuf, outStream);

1 个答案:

答案 0 :(得分:0)

根据您的实际情况,您可能需要显式刷新/关闭输出。

而且,从直觉上来说,考虑输出链的压缩部分对我来说更有意义。这样,如果对输出进行多次写入,您将获得一致的行为,而不必冒险编写未经压缩的部分。

这是我的改写,添加了一些样式元素:

  • 表达逻辑(不重复文件路径)
  • 使用C ++类型(用于字符串操作)
  • 不要指定多余的std::ios标志
  • 使用现有的convenience typedefs
std::string const filename = "/home/username/Desktop/temp/data.csv";

{
    std::ofstream outStream(filename + ".gz", std::ios::binary);

    boost_io::filtering_ostreambuf compressingBuf;
    compressingBuf.push(boost_io::gzip_compressor());
    compressingBuf.push(outStream);

    {
        std::ifstream inStream(filename);
        copy(inStream, compressingBuf);
        outStream.flush();
    }
}