关于boost :: iostream :: filtering_ostream()的一个简单问题。
我有一个函数(内部)创建一个shared_ptr到boost :: iostream :: filtering_ostream,并返回一个指向std :: ostream的共享指针。
每当我在函数中不使用压缩器时,一切似乎都能正常工作,但只要添加压缩器,输出文件就会损坏。如果我在'getOutputStreamComp'函数中编写文本,那么一切都可以正常工作。
以下示例只是将一些数字写入文件,就像POC一样。
#include <iostream>
#include <string>
#include <fstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/shared_ptr.hpp>
boost::shared_ptr<std::ostream> getOutputStream(const std::string& fileName)
{
boost::shared_ptr<boost::iostreams::filtering_ostream> out(boost::shared_ptr<boost::iostreams::filtering_ostream>(new boost::iostreams::filtering_ostream()));
out->push(boost::iostreams::file_sink(fileName),std::ofstream::binary);
return out;
}
boost::shared_ptr<std::ostream> getOutputStreamComp(const std::string& fileName)
{
boost::shared_ptr<boost::iostreams::filtering_ostream> out(boost::shared_ptr<boost::iostreams::filtering_ostream>(new boost::iostreams::filtering_ostream()));
out->push(boost::iostreams::gzip_compressor());
out->push(boost::iostreams::file_sink(fileName),std::ofstream::binary);
return out;
}
int main(int argc, char** argv)
{
boost::shared_ptr<std::ostream> outFile = getOutputStream("test.txt");
boost::shared_ptr<std::ostream> outFileComp = getOutputStreamComp("testcomp.txt.gz");
// This file is fine.
for (size_t i(0); i < 10000; ++i)
{
*outFile << "i: " << i << std::endl;
}
// This file is corrupt.
for (size_t i(0); i < 10000; ++i)
{
*outFileComp << "i: " << i << std::endl;
}
}
感谢您的任何想法!
谢谢,
戴夫
答案 0 :(得分:1)
在修正拼写错误(*outFile
和*outFileComp
)之后,我无法重现这一点:使用g ++ 4.8.1 / boost-1.53进行编译,它运行并生成两个好的文件:test.txt
10,000行(文件大小78,890)和testcomp.txt.gz
(文件大小22,064),用gunzip解压缩到test.txt
的完整副本。
也许在您的真实程序中,您尝试在程序结束之前(或者至少在最后一次引用shared_ptr之前)检查文件?压缩过滤流的常见问题是,与outFileComp
一样刷新std::endl
并不会强制到目前为止完全写出压缩文件。
答案 1 :(得分:1)
好的,所以我在Cubbi的帮助下找到了这个问题 - 以下一行(出现两次):
out->push(boost::iostreams::file_sink(fileName),std::ofstream::binary);
应该是:
out->push(boost::iostreams::file_sink(fileName,std::ofstream::binary));
代码仍在编译中,所以我可能在filtering_ostream中的某处设置了一个标记,这可能导致问题进一步发生。
此修复程序允许按预期创建文件。