2017-06-22 12 views
0

以下のコードは、iniファイルからプロパティを読み取ります。しかし、プロパティをデフォルト値にしたい。私はputでこれを行い、iniファイルを読み込み、次にgetでプロパティを取得します。property_tree:デフォルトのプロパティ値を設定できませんか?

これは、デフォルトが不要で、プログラムがtestval is 2を出力する場合に問題ありません。ただし、iniファイルのエントリをコメントアウトすると(図のように)、プログラムはNo such node (foo.bar)を出力します。つまり、pt.putはデフォルト値を設定していません。なぜどんなアイデア?私は

#include <iostream> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/ini_parser.hpp> 

int main() { 
    boost::property_tree::ptree pt; 
    int testval = 0; 

    try { 
     pt.put("foo.bar", 1);    // set a default value 
     boost::property_tree::ini_parser::read_ini("test.ini", pt); 

     testval = pt.get<int>("foo.bar"); 

    } catch(boost::property_tree::ptree_error const& e) { 
     std::cout << e.what() << '\n'; 
     return 1; 
    } 

    std::cout << "testval is " << testval << '\n'; 
    return 0; 
} 

そしてtest.iniブースト105300.によです:read_ini()のドキュメントを1として

[foo] 
;bar = 2 

答えて

2

は、プロパティツリーの既存の内容をクリアします。エラーの場合、プロパティツリーは変更されません。

これまでどんなことをしても問題ありません。

+0

しかし、 'read_ini'の後ろに' pt.put' *を置くと、iniファイルの値は常に無視され、常に ' testvalは1'です...? – EML

1

私はあなたがデフォルト値の使用について混乱していると思います。

現時点では ファイルを読み取る前にfoo.barの値を1に変更すると、ファイルを読み取ると、ファイルから読み取られた内容には、foo.barが上書きされます。 iniファイルでbar=2をコメントアウトすると、foo.barに値はありません。

あなたはread_ini後1へプットの値を変更した場合は何がしたいことは、デフォルトに設定されている場合、それはその時点から値が1 put()なっていても正常ですがfoo.bar

1の値を設定します foo.barが定義されていない場合、あなたはのように get()への呼び出しでデフォルト値を指定返すために get()の値:それはそれをタイプを提供しますので、

testval = pt.get<int>("foo.bar", 1); // gets foo.bar from pt, or 1 if not found. 

あなたは2つのパラメータで<int>タイプを省略することができますが、get()への呼び出し仕事をする上記の呼び出しと同じです:

testval = pt.get("foo.bar", 1); 
+0

'get'のデフォルトバージョンの問題は、(a)' foo.bar'がiniファイルに存在しないか、有効な許容条件か、(b) 'fooかを知る方法がないことです。 bar' *は存在しますが、intとして解析できない値を持ちます。これはエラーとしてフラグを立てる必要があります。だから私が誤解しない限り、このバージョンの 'get'は役に立たない。 – EML

+0

デフォルト値の考え方は、ファイルに定義されていない場合に値を取得することです。デフォルト値の定義が異なる場合は、質問に対する回答が得難くなります。このバージョンのgetは、get( "foo.bar"、1)が常にintを返すと期待する意味で便利です。それがintでないか知りたいのであれば、( "foo.bar")を取得して使用しますが、なぜファイル内にあったものを上書きしますか? –

+0

デフォルトの定義に同意します。問題は、 'property_tree'が、(1)iniファイルからキー/ valを読み込むこと、(2)キー*がファイル内にない場合にデフォルトを提供すること、(3)キー*がファイル内に*ある場合、値が整形式であることを確認します。iniファイルに誤って '1'の代わりに' a'を入力し、デフォルトの 'get'を使うと、ユーザーのエラーを黙って無視してしまいます。デフォルト値を使用しているので、デフォルトの 'get'が有用であるとは思いません。 – EML

関連する問題