3
我打算处理大型压缩文件,并且我想将内存映射到文件以加速读取。我采用了现有的常规文件输入示例,但无法编译或工作:-)我正在使用C++ Boost 1.49使用boost :: iostreams mapped_file_source和filtering_streambuf来解压缩文件
任何建议欢迎!
#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>}’
如果无法编译,这是不可能奏效。上面的代码的编译错误是什么? –
@Steve Townsend - 史蒂夫感谢您的回复。我尝试了代码的几个变体,并发布了我认为最接近于我期望代码实现的版本(事件虽然没有编译)。我尝试了下面的代码,但它以异常结束: 'mapped_file_source mmf(“my_file.txt”); ifstream文件; () - > pubsetbuf((char *)mmf.data(),mmf.size());' –