Arm*_*man 6 c++ boost-iostreams bzip2
您好我想使用Boost.IOstreams将我的数据存储到bzip2文件中.
void test_bzip()
{
namespace BI = boost::iostreams;
{
string fname="test.bz2";
{
BI::filtering_stream<BI::bidirectional> my_filter;
my_filter.push(BI::combine(BI::bzip2_decompressor(), BI::bzip2_compressor())) ;
my_filter.push(std::fstream(fname.c_str(), std::ios::binary|std::ios::out)) ;
my_filter << "test" ;
}//when my_filter is destroyed it is trowing an assertion.
}
};
Run Code Online (Sandbox Code Playgroud)
我做错了什么?我正在使用boost 1.42.0.
亲切的问候阿曼.
编辑 如果我删除双向选项代码正在运行:
#include <fstream>
#include <iostream>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <string>
void test_bzip()
{
namespace BI = boost::iostreams;
{
std::string fname="test.bz2";
{
std::fstream myfile(fname.c_str(), std::ios::binary|std::ios::out);
BI::filtering_stream<BI::output> my_filter;
my_filter.push(BI::bzip2_compressor()) ;
//my_filter.push(std::fstream(fname.c_str(), std::ios::binary|std::ios::out)) ; //this line will work on VC++ 2008 V9 but not in G++ 4.4.4
my_filter.push(myfile);
my_filter << "test";
}
}
};
Run Code Online (Sandbox Code Playgroud)
也许有人可以解释为什么?
anfstream
无法复制,所以必须使用push的参考版本
template<typename StreamOrStreambuf>
void push( StreamOrStreambuf& t,
std::streamsize buffer_size = default value,
std::streamsize pback_size = default value );
Run Code Online (Sandbox Code Playgroud)
所以你的函数应该看起来像
std::fstream theFile(fname.c_str(), std::ios::binary | std::ios::out);
// [...]
my_filter.push(theFile) ;
Run Code Online (Sandbox Code Playgroud)
我很惊讶你的编译器允许你的代码,我认为它抱怨对临时的引用......你使用哪个编译器?
归档时间: |
|
查看次数: |
2036 次 |
最近记录: |