1

boost::property_tree を使用して ini ファイルを解析しています。

次のようなことができるようになりたいです。

データ.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明らかに、2 つの[proton]セクションがあるためです。

このようなファイルを解析する別の方法はありますか? おそらくxmlファイルを使用する必要がありますか?

4

1 に答える 1

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

編集: 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 ループを使用して反復処理できます。

于 2013-03-02T19:58:41.293 に答える