我有一些数据要格式化和输出,可以是原始文本文件,也可以是 .gz 压缩文本文件。
因此,我想做这样的事情:
shared_ptr<ofstream> file = make_shared<ofstream>(filename.c_str());
shared_ptr<ostream> stream;
if (compressed) {
stream = getCompressedStream(*file);
} else {
stream = std::move(file);
}
for (auto c = data.begin(); c != data.end(); ++c) {
*stream << **c << "\t" << (*c)->getThing() << endl;
}
使用 getCompressedStream 解密流并返回新的非加密流的函数:
std::unique_ptr<std::ostream> getCompressedStream(std::ofstream& file)
{
typedef io::filtering_ostream filter;
std::unique_ptr<filter> out = std::unique_ptr<filter> (new filter());
out->push(io::gzip_compressor());
out->push(file);
return std::move(out);
}
所以我希望 getCompressedStream 抽象调用 boost lib,这样我就只在我的主程序中使用 std 流。
它不起作用:.gz 文件已损坏/不可读。
根据这个线程,过滤流的输出是在对象的销毁中完成的。因此,我不知道它是否可以用 shared_ptr 干净地完成。我不知道文件或流是否首先被破坏,我想这会导致问题。
您认为以这种方式实现 getCompressedStream 可行吗?你会改变什么?
谢谢
编辑:如果我切换到常规指针而不是共享指针,它会起作用,并在文件之前明确删除流。