Как сжать файл (gzip) с помощью библиотек Boost в C++

Я пытаюсь сжать файл с помощью библиотеки 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.

Я знаю, что почти весь код неправильный, но я понятия не имею, кто его правильно напишет.


person Vasco Baptista    schedule 03.07.2013    source источник
comment
Запуск gzip как внешней команды не вариант?   -  person Assaf Lavie    schedule 03.07.2013
comment
Что происходит, когда вы запускаете это?   -  person Assaf Lavie    schedule 03.07.2013


Ответы (3)


Основываясь на следующем руководстве, я считаю, что ваш код должен быть:

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;
}

По сути, вы читаете ввод, сжимаете его и сохраняете данные.

person Mr. Beer    schedule 03.07.2013
comment
Спасибо! Я собираюсь попробовать :) - person Vasco Baptista; 09.07.2013
comment
Этот код создаст zip-файл со сжатыми данными, а не как сжатый файл. - person rawjean; 21.03.2017

Я уже решил это! Я перешел на библиотеку ZLIB.

#include <zlib.h>

(...)

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

Этот код работает, вам просто нужно указать двоичный тип для выходного потока: std::ios_base::binary.

person Anton Shmelev    schedule 01.11.2016