如何在通过过滤器链读取时禁用boost::iostreams缓冲区
How to disable boost::iostreams buffer when reading through a filter chain
我有一些代码大致如下:
boost::iostreams::filtering_istreambuf in;
in.push(Lz4DecompressionFilter());
in.push(AesDecryptionFilter());
in.push(file_source("somefile"));
我已经有存储结果长度的元数据:
std::vector<char> buf;
buf.reserve(resultLength /* retrieved from a meta-data server */);
std::streamsize ret = in.read(buf, buf.capacity);
通过添加跟踪点,我观察到Lz4和Aes过滤器只能读取128字节。此外,如果我用自定义设备替换file_source
,它只能读取4096个字节。
既然我确切地知道读取的大小,有没有一种方法可以完全禁用iostreams中的缓冲,并将读取链接到过滤器中?我知道我可以更改缓冲区大小,但我有兴趣完全禁用它们。
-
根据定义,标准流使用缓冲区抽象。这在很大程度上是因为暴露的一些函数需要存在缓冲区(peek/putback)。
-
如果没有缓冲,压缩和加密将如何工作?压缩和块密码都需要对(有时甚至是固定大小的)块进行操作。
-
回复:
此外,如果我用自定义设备替换file_source,它只能读取4096字节。
你会期待什么样的行为?你期望无限大小的读数吗?
- 在面向流的处理中,使用>4k的块是非常不寻常的。在这种情况下,是否只想先将所有输入复制到一个大缓冲区中(可能使用
array_sink
…)
真的,看起来你只是想增加缓冲区的大小是的。
相关文章:
- 隐式声明的 boost::iostreams::mapped_file_source 已被弃用
- 尝试从boost :: iostreams访问源设备
- BOOST :: iostreams ::::复制似乎太慢了
- boost::iostreams 解压缩返回一个空流
- 为什么使用boost :: iostreams :: zlib_compressor boost :: iostream
- 使用Visual Studio编译代码时,boost::iostreams::multichar_input_filte
- 使用 CMake 对 boost::iostreams::mapped_file_source::init() 的未定义
- boost::iostreams::mapped_file_sink 抛出未知异常
- 如何通过 boost::iostreams 管道进入 std::cout
- 如何将boost::iostreams::mapped_file_source与gzip输入文件一起使用
- 使用boost iostreams将数组读写到压缩文件中
- 无法打开具有boost::iostreams::file的文件
- 使用 Boost::iostreams 两用过滤器
- 如何在通过过滤器链读取时禁用boost::iostreams缓冲区
- boost::iostreams::copy-sink-ENOSPC(设备上没有剩余空间)错误处理
- 找不到'boost/iostreams/device/file_descriptor.hpp'文件错误
- 使用 boost::iostreams 和 zlib 读取.gz文件的运行时错误
- 使用 boost::iostreams mapped_file_source 和 filtering_streambuf
- boost::iostreams:filtering_stream的基础流的类型是什么
- boost iostreams库存在,但我无法链接它