Как мне читать / записывать сжатые файлы в C ++? - PullRequest
11 голосов
/ 08 марта 2009

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

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

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 ]

13 голосов
/ 21 октября 2011

Чтобы дать больше подробностей, чем было кратко сказано другими пользователями, вот как мне удалось работать с 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
13 голосов
/ 08 марта 2009

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

9 голосов
/ 08 марта 2009

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

Boost's iostream lib также имеет потоки gzip и bzip2.

РЕДАКТИРОВАТЬ: Обновлена ​​ссылка, чтобы указывать на последнюю версию кода, который включает в себя серьезное исправление ошибки.

3 голосов
/ 22 декабря 2011

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

https://gist.github.com/1508048

1 голос
/ 09 марта 2009

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

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

...