Распаковка файла с использованием boost - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу распаковать файл, используя boost, который был сжат с помощью bzip2

Я попробовал следующее, что приводит к ошибке, которую я не могу объяснить

std::stringstream readData(const std::string path) {
        std::stringstream myStream;
        std::ifstream input(path,std::ios_base::in);

        boost::iostreams::filtering_streambuf<boost::iostreams::input>in;
        in.push(input);
        in.push(boost::iostreams::bzip2_decompressor());
        boost::iostreams::copy(in,myStream);

        return myStream;
    }

Я использовал c ++17, увеличьте 1.58 и gcc 8.0, чтобы скомпилировать код выше

и получить следующую ошибку:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injectorstd::logic_error >'
what(): chain complete

Буду признателен за любую помощь / советы о том, как решить эту проблему

1 Ответ

0 голосов
/ 24 ноября 2018

Устройство должно быть последним элементом, который вы нажимаете на filtering_streambuf, после того, как вы нажали на устройство, вам не разрешено нажимать что-либо еще, именно поэтому вы получаете сообщение об ошибке.См. https://www.boost.org/doc/libs/1_68_0/libs/iostreams/doc/classes/filtering_streambuf.html#policy_push

Ваш код должен быть:

std::stringstream readData(const std::string path) {
    std::stringstream myStream;
    std::ifstream input(path,std::ios_base::in);

    boost::iostreams::filtering_streambuf<boost::iostreams::input>in;
    in.push(boost::iostreams::bzip2_decompressor());
    in.push(input);
    boost::iostreams::copy(in,myStream);

    return myStream;
}
...