Анализатор Boost :: ptree не может прочитать контейнер из файла XML

Мне нужно сделать простой ввод-вывод файла XML. Я использую boost :: ptree.

struct structure
{
std::string str;
int ival;
std::list<bool> bval;

void save(const std::string& filename) {
ptree pt;
pt.put("main.str", str);
pt.put("main.ival", ival);

for (const auto& x : bval)
pt.put("main.bval.b", x);

write_xml(filename, pt);
}

void load(const std::string& filename) {
ptree pt;

read_xml(filename, pt);

str = pt.get("main.str", str);
ival = pt.get("main.ival", ival);

for(auto& v : pt.get_child("main.bval"))
bval.insert(v.second.data());
}
};

int main()
{
structure b, s;
s.str = "abc";
s.ival = 14;
s.bval = { 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 };

try
{
s.save("zxx.xml");

b.load("zxx.xml");
}
catch (std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
return 0;
}

Ввод не работает правильно, потому что в файл записывается только один элемент «bval». Также я не знаю, как сделать вывод этого контейнера (bval). Пожалуйста помоги!

1

Решение

Вы должны просто заменить put с add, «Put» предполагает, что ключ не должен быть воссоздан.

С этим исправлением вы можете сделать туда и обратно:

    s.save("zxx.xml");
b.load("zxx.xml");
b.save("zxx2.xml");

Теперь вы можете проверить это zxx.xml равно zxx2.xml,

Видеть это Жить на Колиру печатает:

g++ -std=c++11 -Os -Wall -pedantic main.cpp && ./a.out && md5sum *.xml
8a91a9b67d3ac4518e59d23c90edabb0  zxx.xml
8a91a9b67d3ac4518e59d23c90edabb0  zxx2.xml

список

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <list>
#include <iostream>

using boost::property_tree::ptree;

struct structure
{
std::string str;
int ival;
std::list<bool> bval;

void save(const std::string& filename) {
ptree pt;
pt.put("main.str", str);
pt.put("main.ival", ival);

for (const auto& x : bval)
pt.add("main.bval.b", x);

write_xml(filename, pt);
}

void load(const std::string& filename) {
ptree pt;

read_xml(filename, pt);

str = pt.get("main.str", str);
ival = pt.get("main.ival", ival);

for(auto& v : pt.get_child("main.bval"))
{
bval.push_back(v.second.get<bool>(""));
}
}
};

int main()
{
structure b, s;
s.str = "abc";
s.ival = 14;
s.bval = { 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 };

try
{
s.save("zxx.xml");

b.load("zxx.xml");

b.save("zxx2.xml");
}
catch (std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
return 0;
}
1

Другие решения


По вопросам рекламы [email protected]