下面的代码从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
答案 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);