boost :: iostreams :: gzip compressor - ошибка crc? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую следующий код для сжатия файла в файл 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 голосов
/ 01 ноября 2018

В зависимости от вашей конкретной ситуации вам может потребоваться явно сбросить / закрыть вывод.

Кроме того, для меня более логично рассматривать сжатие как часть выходной цепочки. Таким образом, вы получите согласованное поведение, если у вас будет несколько записей в выводе, вместо того, чтобы рисковать частями записи без сжатия.

Вот мое переписывание того же с добавлением некоторых элементов стиля:

  • выразить логику (не повторять путь к файлу)
  • использовать типы C ++ (для работы со строками)
  • не указывайте избыточные std::ios флаги
  • использовать существующие удобные 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();
    }
}
...