4

我正在尝试使用 azlib_decompressor通过istreambuf_iterator. 我找不到一种内置方法来使用输入迭代器作为流的输入(如果已经存在,请指出一种方法)所以我写了这个源:

template <class cha_type, class iterator_type>
class IteratorSource {
    public:
        typedef cha_type char_type;
        typedef boost::iostreams::source_tag category;
        iterator_type& i;
        iterator_type eof;

        IteratorSource(iterator_type& it, iterator_type end) : i(it), eof(end) {
        }

        std::streamsize read(char* s, std::streamsize n) {
            for(int j = 0; j < n; j++) {
                if(i == eof) {
                    std::cout << "Reached eof after " << j << " bytes\n";
                    return -1;
                }
                char next = *i++;
                std::cout << "Reading " << next << "\n";
                *s++ = next;
            }
            return n;
        }
};

并像这样使用它:

int main() {       
    std::vector<char> data_back = {'\x78', '\x9c', '\x73', '\x04', '\x00', '\x00', '\x42', '\x00', '\x42'};
    auto start = data_back.begin();
    IteratorSource<char, decltype(data_back)::iterator> data(start, data_back.end());

    boost::iostreams::filtering_istreambuf def;
    def.push(boost::iostreams::zlib_decompressor());
    def.push(data);
    boost::iostreams::copy(def, std::cout);
    return 0;
}

给出这个输出:

Reading x
Reading �
Reading s
Reading 
Reading 
Reading 
Reading B
Reading 
Reading B
Reached eof after 9 bytes
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::iostreams::zlib_error> >'
  what():  zlib error
Aborted (core dumped)

我不确定为什么会产生错误,因为从文件加载工作正常。

4

1 回答 1

4
于 2013-11-04T23:58:23.367 回答