#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. Тьфу. Я всегда забываю смыть.