property_tree:无法设置默认属性值?

时间:2017-06-22 12:53:41

标签: c++ boost boost-propertytree

下面的代码从ini文件中读取属性。但是,我希望该属性具有默认值。我在阅读ini文件之前使用put执行此操作,然后使用get检索该属性。

如果不需要默认值,并且程序输出testval is 2,则此方法可以正常工作。但是,如果我注释掉ini文件中的条目(如图所示),程序将输出No such node (foo.bar)。换句话说,pt.put未设置默认值。有什么想法吗?我是关于Boost 105300的。

#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是:

[foo]
;bar = 2

2 个答案:

答案 0 :(得分:2)

根据read_ini()的文档:

  

清除属性树的现有内容。如果出错,则属性树未经修改。

所以无论你事先做什么都没关系。

答案 1 :(得分:1)

我认为您对使用默认值感到困惑。

现在: 如果在读取文件之前将foo.bar的值更改为1,则读取该文件将覆盖foo.bar到从文件读取的内容。如果您在ini文件中注释掉bar=2,则foo.bar没有任何价值。

如果在read_ini之后将put的值更改为1,则该点的值为1是正常的。put()foo.bar的值设置为1。

如果您想要设置get()的默认值,并且未定义foo.bar时返回,则在get()的调用中指定默认值,如下所示:

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

您可以在<int>的2个参数调用中省略get()类型,因为它为其提供了一种类型,因此这相当于上面的调用:

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