如何在读取过滤器链时禁用boost :: iostreams缓冲区

时间:2015-03-02 13:03:43

标签: c++ boost boost-iostreams

我有一些看起来像这样的代码:

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字节。

因为我确切地知道读取应该具有的大小,是否有办法完全禁用iostream中的缓冲并且只是将读取链接到过滤器?我知道我可以change缓冲区大小,但我有兴趣完全禁用它们。

1 个答案:

答案 0 :(得分:0)

  • 标准流按定义使用缓冲区抽象。这很大程度上是因为暴露的某些功能需要缓冲区的存在(窥视/回放)。

  • 如果没有缓冲,压缩和加密如何仍然有效?压缩和分组密码都需要操作(有时甚至是固定大小)块。

  • 回复:

      

    另外,如果我用自定义设备替换file_source,它只会读取4096字节。

    你会有什么样的行为呢?你期望无限大小读数吗?

  • 使用> 4k的块在面向流的处理中是非常不寻常的。在这种情况下,只是想首先将所有输入复制到一个大缓冲区中(可能使用array_sink ...)?

真的,看起来你只是想增加缓冲区大小是的。