Я пытаюсь распаковать файл .7z (или .xz или .lzma), используя
со следующим кодом:
vector<T> readFromCompressedFile(string input_file_path, string output_file_path)
{
namespace io = boost::iostreams;
stringstream strstream;
ifstream file(input_file_path.c_str(), ios_base::in | ios_base::binary);
ofstream out(output_file_path, ios_base::out | ios_base::binary);
boost::iostreams::filtering_istream in;
in.push(io::lzma_decompressor());
in.push(file);
io::copy(in, out);
cout<<strstream.str()<<endl;
Код компилируется, но я получаю исключение времени выполнения (lzma_error), вызванное методом copy
предупреждение: GDB: не удалось установить управляющий терминал: операция не разрешена
прерывание вызывается после создания экземпляра ‘boost :: exception_detail :: clone_impl>’
что (): ошибка lzma: ошибка iostream
Я безуспешно пытался использовать фильтр filtering_streambuf с фрагментом кода, очень похожим на тот, что был в примере с gzip.
https://www.boost.org/doc/libs/1_67_0/libs/iostreams/doc/classes/gzip.html#examples
Однако я могу распаковать файл, сжатый с помощью gzip и с приведенным выше кодом.
Кажется, что проблема ограничена алгоритмом LZMA.
Кто-нибудь с той же проблемой? Есть идеи?
Спасибо
Я могу подтвердить ту же проблему.
Нет проблем с распаковкой файла lzma с помощью других инструментов. В игре может быть что-то версионное или может быть ошибка. Вот исправленная версия кода, в которой не так много шума, что вызывает сомнительный стиль (using namespace std
) и пытается получить больше информации об ошибке:
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/lzma.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/exception/diagnostic_information.hpp>
#include <fstream>
#include <iostream>
namespace io = boost::iostreams;
void foo(std::string input_file_path, std::string output_file_path) {
namespace io = boost::iostreams;
std::ifstream file(input_file_path, std::ios::binary);
std::ofstream out(output_file_path, std::ios::binary);
boost::iostreams::filtering_istreambuf in;
in.push(io::lzma_decompressor());
in.push(file);
try {
io::copy(in, out);
} catch(io::lzma_error const& e) {
std::cout << boost::diagnostic_information(e, true);
std::cout << e.code() << ": " << e.code().message() << "\n";
} catch(boost::exception const& e) {
std::cout << boost::diagnostic_information(e, true);
}
}
int main() {
foo("test.cpp.lzma", "output.txt");
}
В моей системе я убедился, что и тестовая программа, и / usr / bin / lzma ссылаются на одну и ту же версию библиотеки, поэтому проблемы с версионированием на данный момент кажутся довольно маловероятными:
Я думаю, что проблема должна быть сообщена вверх по течению (на повысить Trac, список рассылки или вопрос GitHub)
Других решений пока нет …