Как мне читать / записывать архивированные файлы на C ++?
-
05-07-2019 - |
Вопрос
Как мне читать / записывать архивированные файлы на 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()
).
Решение
Очевидно, вам нужен cpp-файл, в котором также определен деструктор gzstreambase, т.е. gzstream.cpp (это ошибка ссылки).libz - это просто c-api для gzip, он ничего не знает о потоках c ++ stdlib.
Библиотека iostream Boost также содержит потоки gzip и bzip2.
Редактировать:Обновил ссылку, чтобы она указывала на последнюю версию кода, которая включает в себя исправление серьезной ошибки.
Другие советы
Рассмотрите возможность использования фильтров Boost zip.По их словам, это поддерживает bzip
, gzip
и zlib
формат.
Чтобы дать больше подробностей, чем было кратко упомянуто другими пользователями, вот как мне удалось работать с 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 только для заголовков, которая должна быть проще в использовании.
Это с " домашней страницы библиотеки Gzstream " Р>
Либо скомпилируйте gzstream.C вручную, поместите его в какую-нибудь библиотеку и переместите gzstream.h в поиске включения путь вашего компилятора. Или используйте предоставленный Makefile, адаптируйте его переменные, и следуйте замечаниям в Makefile.