2012-04-30 61 views
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>}’ 
+0

如果無法編譯,這是不可能奏效。上面的代碼的編譯錯誤是什麼? –

+0

@Steve Townsend - 史蒂夫感謝您的回覆。我嘗試了代碼的幾個變體,併發布了我認爲最接近於我期望代碼實現的版本(事件雖然沒有編譯)。我嘗試了下面的代碼,但它以異常結束: 'mapped_file_source mmf(「my_file.txt」); ifstream文件; () - > pubsetbuf((char *)mmf.data(),mmf.size());' –

回答

3

對於那些誰可能有興趣在這裏是工作代碼:

#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; 
} 
相關問題