Как читать / писать gzipped-файлы?

как читать / писать gzipped-файлы на C++?

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

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()).

5 ответов


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

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

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


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


чтобы дать более подробную информацию, чем то, что было кратко упомянуто другими пользователями, вот как мне удалось работать с 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

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

https://gist.github.com/1508048


Это из "домашней страницы библиотеки Gzstream"

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