Повышение write_xml до вектора, завернутого в back_insert_device, дает вектор размером 0

#c #boost

Вопрос:

В приведенном ниже коде, почему вектор » v » имеет размер 0? Код работает нормально, если передать write_xml в строковый поток. Но я бы предпочел не платить за распределение строк, когда, в конечном счете, сбрасываю текст XML.

 #include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <vector>
#include <iostream>

using namespace boost::iostreams;

int main()
{
  boost::property_tree::ptree pt;
  pt.put("file.name", "testf");
  pt.put("file.type", "xml");
  pt.put("file.size", 0);
  std::vector<char> v;
  back_insert_device<std::vector<char>> sink{v};
  stream<back_insert_device<std::vector<char>>> os{sink};
  boost::property_tree::write_xml(os, pt);
  std::cout << v.size() << std::endl;
}
 

Ответ №1:

Вы забываете промыть ручей. Вы можете os.flush() или просто позволите деструктору справиться с этим:

Жить На Колиру

 #include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include <vector>

using namespace boost::iostreams;

int main()
{
    boost::property_tree::ptree pt;
    pt.put("file.name", "testf");
    pt.put("file.type", "xml");
    pt.put("file.size", 0);

    std::vector<char> v;
    {
        back_insert_device<std::vector<char>>         sink{v};
        stream<back_insert_device<std::vector<char>>> os{sink};

        boost::property_tree::write_xml(os, pt);
    }
    std::cout << v.size() << std::endl;
}
 

С принтами

 100
 

бонус

Как всегда, используйте библиотеку JSON!

Жить На Колиру

 #include <boost/json.hpp>
#include <boost/json/src.hpp>
#include <iostream>

namespace json = boost::json;

int main() {
    json::object file{
        {"name", "testf"},
        {"type", "xml"},
        {"size", 0},
    };

    auto v = serialize(json::object{{"file", file}});
    std::cout << v.size() << ": " << v << std::endl;
}
 

С принтами

 47: {"file":{"name":"testf","type":"xml","size":0}}
 

Комментарии:

1. Тьфу. Я всегда забываю смыть.