Jak skompresować plik (gzip) przy użyciu bibliotek boost w C++

Próbuję skompresować plik przy użyciu biblioteki boost (gzip). To proste zadanie: załóżmy, że mam plik data.xml i muszę go skompresować do formatu data.xml.gz. Mogę nawet użyć domyślnych wartości kompresji, nie ma to znaczenia.

Próbowałem szukać na stronach Google i BOOST, ale bez powodzenia.

Mam co następuje:

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 zawiera pełną lokalizację pliku XML

FREQUENCY_HISTORY_FILE_GZIP zawiera pełną lokalizację pliku XML.GZ

Wiem, że prawie cały kod jest błędny, ale nie mam pojęcia, kto napisać go we właściwy sposób.


person Vasco Baptista    schedule 03.07.2013    source źródło
comment
Czy uruchomienie gzip jako polecenia zewnętrznego nie wchodzi w grę?   -  person Assaf Lavie    schedule 03.07.2013
comment
Co się stanie, gdy to uruchomisz?   -  person Assaf Lavie    schedule 03.07.2013


Odpowiedzi (3)


Na podstawie poniższego samouczek uważam, że Twój kod powinien wyglądać:

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

Zasadniczo czytasz dane wejściowe, kompresujesz je i zapisuje dane

person Mr. Beer    schedule 03.07.2013
comment
Dzięki! zamierzam spróbować :) - person Vasco Baptista; 09.07.2013
comment
Ten kod utworzy plik ZIP ze skompresowanymi danymi, a nie skompresowanym plikiem. - person rawjean; 21.03.2017

Już to rozwiązałem! Zmieniłem na bibliotekę 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

Ten kod działa, wystarczy określić typ binarny dla strumienia wyjściowego: std::ios_base::binary.

person Anton Shmelev    schedule 01.11.2016