首页 > 解决方案 > 为什么需要销毁使用 boost::iostreams::zlib_compressor 的 boost::iostream::filtering_ostream 才能写入接收器?

问题描述

今天花了一些时间调试问题后,我注意到boost::iostream::filtering_ostream需要销毁才能写入接收器。

测试代码:

#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/zlib.hpp>

#include <sstream>

struct ZlibOstream : boost::iostreams::filtering_ostream
{
    ZlibOstream(std::ostream& os)
    {
        boost::iostreams::filtering_ostream::push(boost::iostreams::zlib_compressor{});
        boost::iostreams::filtering_ostream::push(os);
    }
};

int main()
{   
    std::ostringstream oss;

    #ifdef HAS_SCOPE
    {
    #endif

    ZlibOstream zlibOstream{oss};

    zlibOstream << "This is a test string.\n";

    #ifdef HAS_SCOPE
    }
    #endif

    return (oss.tellp() == 0);
}

调用flush()并不能解决问题,当我删除zlib_compressor.

大肠杆菌的结果: https ://coliru.stacked-crooked.com/a/7cd166d2d820e838

这种行为背后的原因是什么?

标签: c++boostiostream

解决方案


这实际上与这个问题有关:

刷新 boost::iostreams::zlib_compressor。如何获得“同步刷新”?

你需要一个调用来boost::iostreams::zlib_compressor::close实现同花顺。

您可以通过调用pop()或来实现此reset()目的boost::iostream::filtering_ostream

请注意,pop()正如其名称所暗示的那样,弹出链中的最后一个过滤器并reset()完全清除链,这样filtering_ostream以后就无法使用了。

例子:

#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/zlib.hpp>

#include <sstream>

struct ZlibOstream : boost::iostreams::filtering_ostream
{
    ZlibOstream(std::ostream& os)
    {
        boost::iostreams::filtering_ostream::push(boost::iostreams::zlib_compressor{});
        boost::iostreams::filtering_ostream::push(os);
    }
};

int main()
{   
    std::ostringstream oss;

    ZlibOstream zlibOstream{oss};

    zlibOstream << "This is a test string.\n";

    zlibOstream.reset(); // needed if you want to write to oss

    return oss.tellp();
}

推荐阅读