2013-03-02 2 views
0

Я использую boost :: property_tree для анализа ini-файлов.Boost .ризатор файла .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

Право, дублирующиеся разделы для файлов INI не допускаются. Но XML и JSON должны быть в порядке. –

+0

Ладно, спасибо, просто нужно разобраться с разбором xml. – user3728501

+0

Связанный вопрос: [Boost property_tree: работа с простыми массивами или контейнерами] (http://stackoverflow.com/q/4986052/1084416). –

ответ

3

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

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; 
} 

EDIT: Можно использовать массивы для 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 просто ptree, и вы можете прокручивать его с помощью цикла for.

+0

О, ничего себе, спасибо, это похоже на билет. Могу ли я использовать это с тегами в этом формате: '' – user3728501

+0

Кстати, вы можете использовать массивы в JSON, что-то вроде: «position»: [-1, 0, 0] –