gpt4 book ai didi

c++ - 将 filtering_istream 类型的变量转换为 ifstream 类型?

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:42 26 4
gpt4 key购买 nike

我在使用“boost/iostreams/filtering_stream.hpp”时使用 filetering_istream 类型将信息保存在解压缩的文件中。但是我想把它转换成 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$

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

最佳答案

来自 filtering_stream 的引用资料:

filtering_stream derives from std::basic_istream, std::basic_ostream or std::basic_iostream, depending on its Mode parameter.

所以不,你不能将一个filtering_stream直接转换为一个ifstream,因为两者之间没有继承关系。

如果您的过滤器链以 ifstream 设备结尾,您可以改为执行以下操作,您可以通过调用 filtering_stream::component() 来获取该设备。 .对于流,此函数返回一个 boost::iostreams::detail::mode_adapter(您可以通过调用 in.component_type(1) 查看类型)。

依赖内部 boost 类型(由命名空间“detail”表示)可能不是一个好主意,它可能会随着下一个 boost 版本而改变,所以一个解决方法是使用 boost::reference_wrapper .

#include <iostream>
#include <istream>
#include <fstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/core/ref.hpp>

int main(){
std::ifstream file("test_data.dat.gz");

boost::iostreams::filtering_istream in;

in.push(boost::iostreams::gzip_decompressor());

in.push(boost::ref(file));

if( auto pfile = in.component<boost::reference_wrapper<std::ifstream>>( 1 ) )
{
std::ifstream& rfile = *pfile;
std::cout << "is_open: " << rfile.is_open() << "\n";
}
}

关于c++ - 将 filtering_istream 类型的变量转换为 ifstream 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com