gpt4 book ai didi

c++ - Seek 不适用于使用 boost filtering_istreambuf 初始化的 std::istream

转载 作者:太空狗 更新时间:2023-10-29 20:56:05 25 4
gpt4 key购买 nike

我正在尝试读取一个文件。它应该是内存映射的性能。我想使用 iostreams 的 boost 过滤器链来轻松包含 zip、bzip2 和 gzip 解压缩。

我尝试采用Using boost::iostreams mapped_file_source and filtering_streambuf to decompress file中提出的解决方案.

我的问题:当我尝试在流上执行 seek() 时,出现异常:“无随机访问”。这很奇怪,因为从文档中我了解到我可以使用 std::istream 作为接口(interface)。

我想出了以下代码(also on coliru):

#include <iostream>
#include <stdio.h>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>

// and later also include ...
//#include <boost/iostreams/filter/gzip.hpp>
//#include <boost/iostreams/filter/bzip2.hpp>

int main()
{
namespace io = boost::iostreams;
io::mapped_file_source inputDevice; // the device to read from (file)
io::stream<io::mapped_file_source> mappedFileStream; // the memory mapped file stream
io::filtering_istreambuf filteredInputStream; // the source file (stream), together with a chain of filters and/or decompressors


inputDevice = io::mapped_file_source("main.cpp");
mappedFileStream.open(inputDevice); // open device as a readable stream
// add optional filter/decoder/decompressor
//filteredInputStream.push(io::bzip2_decompressor());
//filteredInputStream.push(io::zlib_decompressor());
//filteredInputStream.push(io::gzip_decompressor());
//filteredInputStream.push(io::base64_decoder());
filteredInputStream.push(mappedFileStream); //finally add the readable stream
// now we have a device that is streamed and the contents are filtered the resulting stream can be used like a std::iostream. (in theory)
std::istream inputStream(&filteredInputStream);

std::cout << inputStream.get() << std::endl;
std::cout << inputStream.get() << std::endl;
//fatal error: class boost::exception_detail::clone_impl<struct boost::exception_detail::error_info_injector<class std::ios_base::failure> >: no random access
filteredInputStream.pubseekoff(0, std::ios_base::beg, std::ios_base::in | std::ios_base::out);
inputStream.seekg(0); // fatal error: class boost::exception_detail::clone_impl<struct boost::exception_detail::error_info_injector<class std::ios_base::failure> >: no random access
std::cout << inputStream.get() << std::endl;
std::cout << inputStream.get() << std::endl;
return 0;
}

最佳答案

在撰写问题时,我在这里找到了解决方案。

boost::iostreams, gzip files and tellg

问题与 gzip 有关,但 boost iostream 缓冲区似乎默认为不可搜索。我误解了 boost 文档。

解决方法如下:

替换:

io::filtering_istreambuf filteredInputStream;         

通过

io::filtering_streambuf<io::input_seekable> filteredInputStream;  

在 coliru 上直播:http://coliru.stacked-crooked.com/a/aff637be181a27da

#include <iostream>
#include <stdio.h>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>


// and later also include ...
//#include <boost/iostreams/filter/gzip.hpp>
//#include <boost/iostreams/filter/bzip2.hpp>

int main()
{
namespace io = boost::iostreams;
io::mapped_file_source inputDevice; // the device to read from (file)
io::stream<io::mapped_file_source> mappedFileStream; // the memory mapped file stream
io::filtering_streambuf<io::input_seekable> filteredInputStream; // the source file (stream), together with a chain of filters and/or decompressors
//io::filtering_istreambuf filteredInputStream; // wrong. Defaults to non-seekable. Throws exception on seek or tell


inputDevice = io::mapped_file_source("main.cpp");
mappedFileStream.open(inputDevice); // open device as a readable stream
// add optional filter/decoder/decompressor
//filteredInputStream.push(io::bzip2_decompressor());
//filteredInputStream.push(io::zlib_decompressor());
//filteredInputStream.push(io::gzip_decompressor());
//filteredInputStream.push(io::base64_decoder());
filteredInputStream.push(mappedFileStream); //finally add the readable stream
// now we have a device that is streamed and the contents are filtered the resulting stream can be used like a std::iostream. (in theory)
std::istream inputStream(&filteredInputStream);

std::cout << inputStream.get() << std::endl;
std::cout << inputStream.get() << std::endl;
filteredInputStream.pubseekoff(0, std::ios_base::beg, std::ios_base::in | std::ios_base::out);
inputStream.seekg(0);
std::cout << inputStream.get() << std::endl;
std::cout << inputStream.get() << std::endl;
return 0;
}

关于c++ - Seek 不适用于使用 boost filtering_istreambuf 初始化的 std::istream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415054/

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