Ускоренный анализатор файлов .ini — несколько названий разделов

Я использую boost :: property_tree для анализа INI-файлов.

Я хочу иметь возможность сделать что-то вроде следующего:

data.ini:

[electron]
position=0,0,0
velocity=0,0,0

[proton]
position=1,0,0
velocity=0,0,0

[proton]
position=-1,0,0
velocity=0,0,0

В данный момент программа запускается и выдает эту ошибку: duplicate section name Очевидно, потому что есть два [proton] разделы.

Есть ли альтернативный способ для анализа файла, как это? Должен ли я, возможно, использовать XML-файл?

0

Решение

Вот простой читатель, если вам это нужно:

XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<data>
<electron>
<position>0,0,0</position>
<velocity>0,0,0</velocity>
</electron>
<proton>
<position>1,0,0</position>
<velocity>0,0,0</velocity>
</proton>
<proton>
<position>-1,0,0</position>
<velocity>0,0,0</velocity>
</proton>
</data>

JSON-файл:

{
"electron": {
"position": "0,0,0",
"velocity": "0,0,0"},
"proton": {
"position": "1,0,0",
"velocity": "0,0,0"},
"proton": {
"position": "-1,0,0",
"velocity": "0,0,0"}
}

Читать XML & Протонные узлы JSON:

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

int main()
{
// XML
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml("prop_data.xml", pt);

for(auto& el : pt.get_child("data.proton"))
{
std::cout << el.second.data() << std::endl;
}
}

// JSON
{
boost::property_tree::ptree pt;
boost::property_tree::read_json("prop_data.json", pt);

for(auto& el : pt.get_child("proton"))
{
std::cout << el.second.data() << std::endl;
}
}

return 0;
}

РЕДАКТИРОВАТЬ:
Для JSON можно использовать массивы, например:

...
"position": [-1, 0, 0],
...

И код для чтения значений этого массива:

    for(auto& el : pt.get_child("proton"))
{
std::cout << el.first << std::endl;
for(auto& a : el.second) {
std::cout << a.second.data() << std::endl;
}

std::cout << std::endl;
}

Вот el.second это всего лишь дерево, и вы можете перебирать его, используя цикл for.

3

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

Других решений пока нет …