我使用filetering_istream类型在使用'boost / iostreams / filtering_stream.hpp'时将信息保存在解压缩文件中。但是我想将它转换为ifstream类型。它有什么办法吗?非常感谢!
代码如下:
#include <istream>
#include <fstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
int main(){
std::ifstream file("test_data.dat.gz");
boost::iostreams::filtering_istream in;
in.push(boost::iostreams::gzip_decompressor());
in.push(file);
/* add code to convert filtering_istream 'in' into ifstream 'pfile' */
/* It seems that the following code returns a pointer NULL */
// std::ifstream* pfile = in.component<std::ifstream>(1);
return 0;
}
在尝试zett42提出的boost :: ref和boost :: wrapper后,ifstream确实有效。唯一的问题是它没有给出想要的短语。
在我的.gz文件中,我写道:
THIS IS A DATA FILE!
8 plus 8 is 16
但是使用ifstream,我得到了:
is_open: 1
\213<\373Xtest_data.dat\361\360V"G\307G7OWE.\205\202\234\322b\205\314bC3.\327+>\314$
我不确定这里发生了什么,我能做些什么来恢复吗?
答案 0 :(得分:0)
来自filtering_stream
的参考:
filtering_stream派生自std :: basic_istream,std :: basic_ostream 或std :: basic_iostream,具体取决于其Mode参数。
所以不,你不能将filtering_stream
直接投射到ifstream
,因为两者之间没有继承关系。
相反,如果您的过滤器链以ifstream
设备结束,您可以通过调用filtering_stream::component()
来抓取该设备。对于流,此函数返回boost::iostreams::detail::mode_adapter
(您可以通过调用in.component_type(1)
来查看类型)。
依赖于内部提升类型(由命名空间&#34;详细信息&#34;表示)可能会因下一个提升版本而改变,因此一个解决方法是使用{{1相反。
boost::reference_wrapper