我正在尝试使用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()。
答案 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,链接失败,这是可以理解的,但是编译本身通过了。