Это на самом деле связано с этим вопросом:
Сброс наддува :: 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();
}