2009-03-08 4 views
8

Как читать/записывать gzip-файлы в C++?Как читать/записывать gzip-файлы?

iostream В классы обертки here выглядят хорошо, а вот простой пример использования:

gz::igzstream in(filename); 
std::string line; 
while(std::getline(in, line)){ 
    std::cout << line << std::endl; 
} 

Но я не был в состоянии фактически связать его (хотя у меня есть /usr/lib/libz.a). Простой

g++ test-gzstream.cpp -lz 

не было (undefined reference to gz::gzstreambase::~gzstreambase()).

+0

Таким образом, вы должны использовать igzstream и найти проблему или любое решение в порядке? –

+0

LGPL не вариант для меня, так как я разрабатываю для iOS, знаете ли вы о невирусной альтернативе? – rraallvv

ответ

8

Очевидно, что вам нужен cpp-файл, где также определен деструктор gzstreambase, то есть gzstream.cpp (это ошибка связи). libz - это просто c-api для gzip, он ничего не знает о потоках stdlib C++.

Boost iostream lib имеет потоки gzip и bzip2.

EDIT: Обновлена ​​ссылка, чтобы указать на последнюю версию кода, которая включает исправление основной ошибки.

+0

он использует lib вместо файла .cpp. –

+0

Затем ему нужно связать с lib, где gzstream.cpp был скомпилирован. liblm_access? – Macke

+0

Спасибо, просто компилируем вместе с gzstream.cpp works. – Frank

13

Рассмотрите возможность использования почтовых фильтров Boost. По их словам, он поддерживает bzip, gzip и zlib формат.

1

Это из "Gzstream библиотеки Главная страница"

Либо компилировать gzstream.C вручную, место его в некоторых библиотеки и перемещение gzstream.h в include search путь вашего компилятора. Или используйте предоставленный Makefile, приспособив его переменные и следуйте замечаниям в Makefile.

12

Чтобы предоставить более подробную информацию, чем то, что было кратко упомянуто другими пользователями, вот как мне удалось работать с gzstream на моем компьютере.

Во-первых, я скачал gzstream и установил его в моем доме (две последние строки могут быть добавлены к вашему ~/.bash_profile):

cd ~/src 
mkdir GZSTREAM 
cd GZSTREAM/ 
wget http://www.cs.unc.edu/Research/compgeom/gzstream/gzstream.tgz 
tar xzvf gzstream.tgz 
cd gzstream 
make 
export CPLUS_INCLUDE_PATH=$HOME/src/GZSTREAM/gzstream 
export LIBRARY_PATH=$HOME/src/GZSTREAM/gzstream 

Затем я проверил установку:

make test 
... 
# *** O.K. Test finished successfully. *** 

Наконец , Я написал фиктивную программу для проверки того, что я мог бы эффективно использовать библиотеку:

cd ~/temp 
vim test.cpp 

Вот код (очень минималистский, должен быть значительно улучшен для реальных приложений!):

#include <iostream> 
#include <string> 
#include <gzstream.h> 
using namespace std; 

int main (int argc, char ** argv) 
{ 
    cout << "START" << endl; 

    igzstream in(argv[1]); 
    string line; 
    while (getline(in, line)) 
    { 
    cout << line << endl; 
    } 

    cout << "END" << endl; 
} 

Вот как я скомпилировал:

gcc -Wall test.cpp -lstdc++ -lgzstream -lz 

И последнее, но не в последнюю очередь, вот как я использовал его:

ls ~/ | gzip > input.gz 
./a.out input.gz 
START 
bin/ 
src/ 
temp/ 
work/ 
END 
2

У меня была эта проблема, а также с старый компилятор GCC. Я просто исправил это, создав только заголовок gzstream, который должен быть проще в использовании.

https://gist.github.com/1508048