我正在尝试使用解压缩 .7z(或 .xz 或 .lzma)文件

Linux 平台上的

  • boost 库 1.67.0

  • 使用以下代码:
        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;
    

    代码可以编译,但是我得到了一个由 copy 方法引发的运行时异常 (lzma_error)
    warning: GDB: Failed to set controlling terminal: Operation not permitted
    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::iostreams::lzma_error> >'
      what():  lzma error: iostream error
    

    我尝试使用带有与 gzip 示例非常相似的代码块的 filtering_streambuf 过滤器,但不幸的是

    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 都链接到完全相同的库版本,因此此时似乎不太可能出现版本问题:

    C&#43;&#43; Boost 和 Lzma 解压-LMLPHP

    我认为应该向上游报告问题(在 boost Trac 、邮件列表或 github issue )

    关于C++ Boost 和 Lzma 解压,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50071513/

    10-12 02:01