从函数返回时,错误提升filtering_ostream

时间:2013-10-04 14:09:08

标签: c++ boost gzip iostream

关于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;
    }
}

感谢您的任何想法!

谢谢,

戴夫

2 个答案:

答案 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中的某处设置了一个标记,这可能导致问题进一步发生。

此修复程序允许按预期创建文件。