将filtering_istream类型的变量强制转换为ifstream类型?

时间:2017-04-23 23:21:47

标签: c++ boost casting iostream ifstream

我使用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$

我不确定这里发生了什么,我能做些什么来恢复吗?

1 个答案:

答案 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