0

只是一个关于 boost::iostream::filtering_ostream() 的快速问题。

我有一个函数(在内部)为 boost::iostream::filtering_ostream 创建一个 shared_ptr,并返回一个指向 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;
    }
}

您可能有的任何想法将不胜感激!

谢谢,

戴夫

4

2 回答 2

1

修正错别字(*outFile*outFileComp)后,我无法重现:使用 g++ 4.8.1/boost-1.53​​ 编译,它运行并生成两个好文件:test.txt10,000 行(文件大小 78,890)和testcomp.txt.gz(文件大小 22,064),用 gunzip 解压进入test.txt.

也许在您的真实程序中,您尝试在程序结束之前检查文件(或至少在对 shared_ptr 的最后引用消失之前)?压缩过滤流的一个常见问题是,到目前为止,刷新outFileCompstd::endl不会强制完全写出压缩文件。

于 2013-10-10T00:04:59.353 回答
1

好的,所以我在Cubbi的帮助下找到了问题- 以下行(出现两次):

out->push(boost::iostreams::file_sink(fileName),std::ofstream::binary);

本来应该:

out->push(boost::iostreams::file_sink(fileName,std::ofstream::binary));

代码仍在编译,所以我可能在 filter_ostream 的某处设置了一个标志,这可能会导致进一步的问题。

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

于 2013-10-23T11:40:43.473 回答