使用boost :: iostreams mapped_file_source和filtering_streambuf解压缩文件 [英] Using boost::iostreams mapped_file_source and filtering_streambuf to decompress file

查看:752
本文介绍了使用boost :: iostreams mapped_file_source和filtering_streambuf解压缩文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我计划处理大型压缩文件,我想将内存映射文件加速读取。我采用了常规文件输入的现有示例,但不能得到它编译或工作:-)我使用C ++ Boost 1.49

I plan to process large compressed files and I would like to memory map the files to speedup reading. I adopted the existing example with regular file input but cannot get it either compile nor work :-) I'm using C++ Boost 1.49

任何建议欢迎!

#include<iostream>
#include<boost/iostreams/filtering_streambuf.hpp>
#include<boost/iostreams/copy.hpp>
#include<boost/iostreams/filter/zlib.hpp>
#include<boost/iostreams/device/file.hpp>
#include<boost/iostreams/device/mapped_file.hpp>

void test_decoder_mmf()
{
   using namespace std;
   using namespace boost::iostreams;
   //ifstream file("my_file.txt", ios_base::in | ios_base::binary);
   mapped_file_source file( "my_file.txt" );
   filtering_streambuf< input > in;
   in.push(zlib_decompressor());
   in.push(file);
   copy(in,cout);
}

int main()
{   
   test_decoder_mmf();
   return 0;
}

In file included from /usr/local/include/boost/iostreams/operations.hpp:20:0,
                 from /usr/local/include/boost/iostreams/detail/adapter/mode_adapter.hpp:24,
                 from /usr/local/include/boost/iostreams/detail/resolve.hpp:19,
                 from /usr/local/include/boost/iostreams/detail/push.hpp:24,
                 from /usr/local/include/boost/iostreams/chain.hpp:29,
                 from /usr/local/include/boost/iostreams/filtering_streambuf.hpp:17,
                 from test_boost_iostreams2.cc:2:
/usr/local/include/boost/iostreams/optimal_buffer_size.hpp: In function ‘std::streamsize boost::iostreams::optimal_buffer_size(const T&) [with T = boost::iostreams::mapped_file_source, std::streamsize = long int]’:
/usr/local/include/boost/iostreams/chain.hpp:248:9:   instantiated from ‘void boost::iostreams::detail::chain_base<Self, Ch, Tr, Alloc, Mode>::push_impl(const T&, std::streamsize, std::streamsize) [with T = boost::iostreams::mapped_file_source, Self = boost::iostreams::chain<boost::iostreams::input, char, std::char_traits<char>, std::allocator<char> >, Ch = char, Tr = std::char_traits<char>, Alloc = std::allocator<char>, Mode = boost::iostreams::input, std::streamsize = long int]’
/usr/local/include/boost/iostreams/chain.hpp:216:1:   instantiated from ‘void boost::iostreams::detail::chain_base<Self, Ch, Tr, Alloc, Mode>::push(const T&, std::streamsize, std::streamsize, typename boost::disable_if<boost::iostreams::is_std_io<T> >::type*) [with T = boost::iostreams::mapped_file_source, Self = boost::iostreams::chain<boost::iostreams::input, char, std::char_traits<char>, std::allocator<char> >, Ch = char, Tr = std::char_traits<char>, Alloc = std::allocator<char>, Mode = boost::iostreams::input, std::streamsize = long int, typename boost::disable_if<boost::iostreams::is_std_io<T> >::type = void]’
/usr/local/include/boost/iostreams/chain.hpp:500:7:   instantiated from ‘void boost::iostreams::detail::chain_client<Chain>::push_impl(const T&, std::streamsize, std::streamsize) [with T = boost::iostreams::mapped_file_source, Chain = boost::iostreams::chain<boost::iostreams::input, char, std::char_traits<char>, std::allocator<char> >, std::streamsize = long int]’
/usr/local/include/boost/iostreams/chain.hpp:488:1:   instantiated from ‘void boost::iostreams::detail::chain_client<Chain>::push(const T&, std::streamsize, std::streamsize, typename boost::disable_if<boost::iostreams::is_std_io<T> >::type*) [with T = boost::iostreams::mapped_file_source, Chain = boost::iostreams::chain<boost::iostreams::input, char, std::char_traits<char>, std::allocator<char> >, std::streamsize = long int, typename boost::disable_if<boost::iostreams::is_std_io<T> >::type = void]’
test_boost_iostreams2.cc:17:17:   instantiated from here
/usr/local/include/boost/iostreams/optimal_buffer_size.hpp:39:55: error: ‘optimal_buffer_size’ is not a member of ‘impl {aka boost::iostreams::detail::optimal_buffer_size_impl<boost::iostreams::mapped_file_source>}’


推荐答案

对于那些可能感兴趣的人是工作代码:

For those who might be interested here is the working code:

#include<iostream>
#include<boost/iostreams/copy.hpp>
#include<boost/iostreams/device/mapped_file.hpp>
#include<boost/iostreams/filter/zlib.hpp>
#include<boost/iostreams/filtering_streambuf.hpp>
#include<boost/iostreams/filtering_stream.hpp>
#include<boost/iostreams/stream.hpp>

using namespace std;
using namespace boost::iostreams;

void test_decoder_mmf(const std::string&filename)
{
    stream<mapped_file_source> file;
    filtering_streambuf< input > in;
    file.open(mapped_file_source(filename));
    in.push(zlib_decompressor());
    in.push(file);
    copy(in,cout);
}

int main()
{
   test_decoder_mmf("zlib-compressed-file");
   return 0;
}

这篇关于使用boost :: iostreams mapped_file_source和filtering_streambuf解压缩文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆