你是正确的。
似乎更改集#63057只解决了问题的一部分。
相应的单元测试确实有效。但它使用了copy
算法(也用于composite<>
而不是filtering_istream
,如果这很重要)。
我会将其作为缺陷或回归进行开放。当然,要包含一个展示问题的文件。对我来说,只需使用默认选项压缩/etc/dictionaries-common/words
即可复现问题。
我这里有test.bz2
:http://7f0d2fd2-af79-415c-ab60-033d3b494dc9.s3.amazonaws.com/test.bz2
这是我的测试程序:
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/stream.hpp>
#include <fstream>
#include <iostream>
namespace io = boost::iostreams;
void multiple_member_test();
int main() {
std::ifstream trans_file("test.bz2", std::ios::binary);
io::filtering_istream in;
in.push(io::bzip2_decompressor());
in.push(trans_file);
std::string str;
while(std::getline(in, str))
{
std::cout << str << "\n";
}
}
#include <boost/iostreams/compose.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <cassert>
#include <sstream>
void multiple_member_test()
{
std::string data(20ul << 20, '*');
std::vector<char> temp, dest;
io::filtering_ostream out;
out.push(io::bzip2_compressor());
out.push(io::back_inserter(temp));
io::copy(boost::make_iterator_range(data), out);
out.push(io::back_inserter(temp));
io::copy(boost::make_iterator_range(data), out);
io::filtering_istream in;
in.push(io::bzip2_decompressor());
in.push(io::array_source(&temp[0], temp.size()));
io::copy(in, io::back_inserter(dest));
assert(data.size() * 2 == dest.size());
assert(std::equal(data.begin(), data.end(), dest.begin()));
assert(std::equal(data.begin(), data.end(), dest.begin() + dest.size() / 2));
dest.clear();
io::copy(
io::array_source(&temp[0], temp.size()),
io::compose(io::bzip2_decompressor(), io::back_inserter(dest)));
assert(data.size() * 2 == dest.size());
assert(std::equal(data.begin(), data.end(), dest.begin()));
assert(std::equal(data.begin(), data.end(), dest.begin() + dest.size() / 2));
}
boost/iostreams/filter/bzip2.hpp
中。使用Boost 1.72,我现在可以成功解压多流文件。 - HyperBoar