C ++ Boost и Lzma декомпрессия - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь распаковать файл .7z (или .xz или .lzma), используя

  • библиотека повышения 1.67.0 на платформе Linux

со следующим кодом:

    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), вызванное методом копирования

предупреждение: 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.

Кто-нибудь с той же проблемой? Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 28 апреля 2018

Я могу подтвердить ту же проблему.

Нет проблем с распаковкой файла 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 ссылаются на одну и ту же версию библиотеки, поэтому проблемы с версионированием на данный момент кажутся довольно маловероятными:

enter image description here

Я думаю, что о проблеме следует сообщать в восходящем направлении (на boost Trac , в списке рассылки или github проблема )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...