使用boost中的property_tree实现配置文件

property_tree是专为配置文件而写,支持xml,ini和json格式文件

ini比较简单,适合简单的配置,通常可能需要保存数组,这时xml是个不错的选择。

使用property_tree也很简单,boost自带的帮助中有个5分钟指南

http://www.boost.org/doc/libs/1_46_1/doc/html/boost_propertytree/tutorial.html

这里写一下使用xml来保存多维数组,在有些情况下一维数组并不能满足要求。

举个简单的例子吧:

xml格式如下:

<debug>   <total>3</total>  <persons>    <person>    <age>23</age>    <name>hugo</name>  </person>  <person>    <age>23</age>     <name>mayer</name>  </person>  <person>    <age>30</age>    <name>boy</name>  </person>  </persons></debug>

定义结构体如下:

 1 struct person 2 { 3  int age; 4  std::string name; 5 }; 6  7 struct debug_persons 8 { 9  int itsTotalNumber;10  std::vector<person> itsPersons;11  void load(const std::string& filename);12  void save(const std::string& filename);13 };

复制代码

2个载入和保存的函数:

 1 void debug_persons::save( const std::string& filename ) 2 { 3  using boost::property_tree::ptree; 4  ptree pt; 5  6  pt.put("debug.total", itsTotalNumber); 7  8  BOOST_FOREACH(const person& p,itsPersons) 9  {10   ptree child;11   child.put("age",p.age);12   child.put("name",p.name);13   pt.add_child("debug.persons.person",child);14  }15  // Write property tree to XML file16  write_xml(filename, pt);17 18 }19 20 void debug_persons::load( const std::string& filename )21 {22  using boost::property_tree::ptree;23  ptree pt;24 25  read_xml(filename, pt);26  itsTotalNumber = pt.get<int>("debug.total");27 28  BOOST_FOREACH(ptree::value_type &v, pt.get_child("debug.persons"))29  { 30   //m_modules.insert(v.second.data());31   person p;32   p.age = v.second.get<int>("age");33   p.name = v.second.get<std::string>("name");34   itsPersons.push_back(p);35  }36 }

复制代码

main中的代码

 1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3   4  try 5  { 6     debug_persons dp; 7     dp.load("debug_persons.xml"); 8     std::cout<<dp<<std::endl; 9     person p;10     p.age = 100;11     p.name = "old man";12     dp.itsPersons.push_back(p);13     dp.save("new.xml");14     std::cout << "Success\n";15  }16  catch (std::exception &e)17  {18   std::cout << "Error: " << e.what() << "\n";19  }20  return 0;21 }

复制代码

这里为了调试输出增加了以下代码:

 1 std::ostream& operator<<(std::ostream& o,const debug_persons& dp) 2 { 3    o << "totoal:" << dp.itsTotalNumber << "\n"; 4    o << "persons\n"; 5    BOOST_FOREACH(const person& p,dp.itsPersons) 6    { 7       o << "\tperson: Age:" << p.age << " Nmae:" << p.name << "\n"; 8    } 9  return o;10 }

复制代码

ps:需要包含以下文件

1 #include <boost/property_tree/ptree.hpp>2 #include <boost/property_tree/xml_parser.hpp>3 #include <boost/foreach.hpp>4 #include <vector>5 #include <string>6 #include <exception>7 #include <iostream>

使用boost中的property_tree实现配置文件,布布扣,bubuko.com

时间: 2024-11-05 02:18:19

使用boost中的property_tree实现配置文件的相关文章

Spring中加载xml配置文件的六种方式

因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装入系统,这就需要利用Spring去动态加载某一位置下的配置文件,所以就总结了下Spring中加载xml配置文件的方式,我总结的有6种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都支持使用xml装配bean,包括: XmlBeanFactory,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicati

spring项目中dubbo相关的配置文件出现红叉的问题

近来在eclipse中导入了一个web项目,但是发现项目上有红色的叉号. 原来是spring中关于dubbo的配置文件报错了. Multiple annotations found at this line:- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'. 解决方法: 从网上下载下来dubbo.xsd

boost中自动确定数据类型(BOOST_TYPEOF和BOOST_AUTO)的使用

#include<boost/typeof/typeof.hpp> #include<vector> #include<iostream> #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() //为了注册新的数据类型 using namespace std; namespace ex{ //定义新的数据类型 struct demo_class { int a,b; }; BOOST_TYPEOF_REGISTER_T

boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

1.实现多线程方法: 其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i)        {            boost::shared_ptr<boost::thread> pTh(new boost::thread(                boost::bind(&boost::asio::io_service::run,&m_ioService)));            m_l

spring加载jar包中的多个配置文件[转载]

在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*:beanconfigs/applicationContext_2.xml, ...

JSP中利用Properties读写配置文件

JSP中利用Properties读写配置文件 java 代码: package com.reason.test; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.Outp

3.Spring框架中的标签与配置文件分离

1.Spring框架中标签的配置 1. id属性和name属性的区别 * id -- Bean起个名字,在约束中采用ID的约束,唯一 * 取值要求:必须以字母开始,可以使用字母.数字.连字符.下划线.句话.冒号 id:不能出现特殊字符 * name -- Bean起个名字,没有采用ID的约束(基本不在使用) * 取值要求:name:出现特殊字符.如果<bean>没有id的话 , name可以当做id使用 * Spring框架在整合Struts1的框架的时候,Struts1的框架的访问路径是以/

Boost中的Timer的使用——计算时间流逝

使用Boost中的Timer库计算程序的执行时间 程序开发者都会面临一个共同的问题,即写出高质量的代码完成特定的功能.评价代码质量的一个重要标准就是算法的执行效率,也就是算法的执行时间.为了可靠的提高程序的执行效率,首先要知道执行程序所消耗的时间,然后找出可行的方案对程序进行优化.C++程序员在开发代码的过程中难免会遇见此类问题,本文以Boost中的Timer库为例,详细讲解如何测量程序的执行时间. Boost中Timer库的介绍 Timer是Boost中的一个很小的时间库,提供时间度量和进度显

nginx指令中的优化(配置文件)

nginx指令中的优化(配置文件)worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数.worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu.worker_rlimit_nofile 102400; 这个指令是指当一个