结合使用operator <<和boost iostreams压缩过滤器

时间:2019-05-22 09:33:26

标签: c++ boost

我正在尝试使用boost iostreams压缩过滤器通过流插入运算符(<<)将文件写入文件。名称“ filtering_ostreambuf”表明,此行为应像流一样,但未为此类定义operator <<。这是一些显然无法编译的代码。

#include <boost/iostreams/filter/lzma.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/device/file.hpp>

namespace io = boost::iostreams;

int main() {

  io::filtering_ostreambuf out;
  io::file_sink ofs("output.xz");
  out.push(ofs);
  out.push(io::lzma_compressor());

  for (int i=0; i<16; ++i) {
    out << i << std::endl;
  }

  return 0;
}

按照gzip解压缩的示例,我尝试将stringstream用作“源”,并使用boost iostreams copy()。但是(1)它不起作用,(2)即使它起作用,对我来说似乎太冗长了,听起来也不是很有效。

有没有一种方法可以使用boost iostream,这样我就可以正常地将其写入过滤器链,就好像它是流一样?我想使用<<不是write()。

1 个答案:

答案 0 :(得分:0)

那是因为您使用ostreambuf只是一个流缓冲区。 stream类从std::basic_ostream派生并支持formatted io "stream" operators(它们实际上是移位运算符)。

所以这应该起作用:

#include <boost/iostreams/filter/lzma.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/file.hpp>

namespace io = boost::iostreams;

int main() {

  io::filtering_ostream out;
  io::file_sink ofs("output.xz");
  out.push(io::lzma_compressor());
  out.push(ofs);

  for (int i=0; i<16; ++i) {
    out << i << std::endl;
  }

  return 0;
}

wandbox,链接失败,这是可以理解的,但是编译本身通过了。