boost::property_tree读取解析ini文件--推荐
boost::property_tree读取解析ini文件
- #include "stdafx.h"
- #include <iostream>
- #include <boost/property_tree/ptree.hpp>
- #include <boost/property_tree/ini_parser.hpp>
- int main()
- {
- boost::property_tree::ptree pt;
- boost::property_tree::ini_parser::read_ini("D:\\Overlay.ini", pt);
- std::cout << pt.get<std::string>("OVERLAY.OverlayFontName") << std::endl;
- pt.put<std::string>("OVERLAY.OverlayFontName","宋体");
- std::cout << pt.get<std::string>("OVERLAY.OverlayFontName") << std::endl;
- boost::property_tree::ini_parser::write_ini("D:\\Overlay.ini",pt);
- return 0;
- }
在C++11下,宽字节和单字节转换就简单了。使用std::wstring_convert和std::codecvt_utf8 来处理UTF8与WChar之间的互转.
- #include <iostream>
- #include <string>
- #include <locale>
- #include <codecvt>
- #include <fstream>
- int main(int argc, char *argv[])
- {
- std::wstring str = L"123,宋体!";
- std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
- std::string narrowStr = conv.to_bytes(str);
- {
- std::ofstream ofs ("c:\\test.txt");
- ofs << narrowStr;
- }
- std::wstring wideStr = conv.from_bytes(narrowStr);
- {
- std::locale::global(std::locale("Chinese-simplified"));
- std::wofstream ofs (L"c:\\testW.txt");
- ofs << wideStr;
- }
- }
另外可以保存函数,使用ptree:
1 struct debug_simple
2 {
3 int itsNumber;
4 std::string itsName; //这里使用string就可以
5 void load(const std::string& filename); //载入函数
6 void save(const std::string& filename); //保存函数
7 };
保存函数,使用ptree:

1 void debug_simple::save( const std::string& filename )
2 {
3 using boost::property_tree::ptree;
4 ptree pt;
5
6 pt.put("debug.number",itsNumber);
7 pt.put("debug.name",itsName);
8
9 write_xml(filename,pt);
10 }

载入函数使用的wptree,读取的值为wstring,需转换成string

1 void debug_simple::load( const std::string& filename )
2 {
3 using boost::property_tree::wptree;
4 wptree wpt;
5 read_xml(filename, wpt);
6
7 itsNumber = wpt.get<int>(L"debug.number");
8 std::wstring wStr = wpt.get<std::wstring>(L"debug.name");
9 itsName = std::string(wStr.begin(),wStr.end()); //wstring转string
10 }
main函数:

1 int _tmain(int argc, _TCHAR* argv[])
2 {
3
4 try
5 {
6 debug_simple ds,read;
7 ds.itsName = "汉字english";
8 ds.itsNumber = 20;
9
10 ds.save("simple.xml");
11 read.load("simple.xml");
12
13 std::cout<<read.itsNumber<<read.itsName;
14
15 }
16 catch (std::exception &e)
17 {
18 std::cout << "Error: " << e.what() << "\n";
19 }
20 return 0;
21 }
由于.ini文件是utf-8格式的,所以操作时要utf-8到unicode转换,或unicode到utf-8转换;
- // PropertyTree.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- #include <boost/property_tree/ptree.hpp>
- #include <boost/property_tree/ini_parser.hpp>
- //unicode 转UTF8
- //参数1是UTF8字符串当前位置指针,这里必须要是指针,因为必须要通过第1个字符进行判断才知道一个完整的字符的编码要向后取多少个字符
- //参数2是返回的UCS-2编码的Unicode字符
- inline int UTF82UnicodeOne(const char* utf8, wchar_t& wch)
- {
- if (utf8==NULL)
- {
- return -1;
- }
- //首字符的Ascii码大于0xC0才需要向后判断,否则,就肯定是单个ANSI字符了
- unsigned char firstCh = utf8[0];
- if (firstCh >= 0xC0)
- {
- //根据首字符的高位判断这是几个字母的UTF8编码
- int afters, code;
- if ((firstCh & 0xE0) == 0xC0)
- {
- afters = 2;
- code = firstCh & 0x1F;
- }
- else if ((firstCh & 0xF0) == 0xE0)
- {
- afters = 3;
- code = firstCh & 0xF;
- }
- else if ((firstCh & 0xF8) == 0xF0)
- {
- afters = 4;
- code = firstCh & 0x7;
- }
- else if ((firstCh & 0xFC) == 0xF8)
- {
- afters = 5;
- code = firstCh & 0x3;
- }
- else if ((firstCh & 0xFE) == 0xFC)
- {
- afters = 6;
- code = firstCh & 0x1;
- }
- else
- {
- wch = firstCh;
- return 1;
- }
- //知道了字节数量之后,还需要向后检查一下,如果检查失败,就简单的认为此UTF8编码有问题,或者不是UTF8编码,于是当成一个ANSI来返回处理
- for(int k = 1; k < afters; ++ k)
- {
- if ((utf8[k] & 0xC0) != 0x80)
- {
- //判断失败,不符合UTF8编码的规则,直接当成一个ANSI字符返回
- wch = firstCh;
- return 1;
- }
- code <<= 6;
- code |= (unsigned char)utf8[k] & 0x3F;
- }
- wch = code;
- return afters;
- }
- else
- {
- wch = firstCh;
- }
- return 1;
- }
- //参数1是UTF8编码的字符串
- //参数2是输出的UCS-2的Unicode字符串
- //参数3是参数1字符串的长度
- //使用的时候需要注意参数2所指向的内存块足够用。其实安全的办法是判断一下pUniBuf是否为NULL,如果为NULL则只统计输出长度不写pUniBuf,这样
- //通过两次函数调用就可以计算出实际所需要的Unicode缓存输出长度。当然,更简单的思路是:无论如何转换,UTF8的字符数量不可能比Unicode少,所
- //以可以简单的按照sizeof(wchar_t) * utf8Leng来分配pUniBuf的内存……
- int UTF82Unicode(const char* utf8Buf, wchar_t *pUniBuf, int utf8Leng)
- {
- if ((utf8Buf==NULL)||(pUniBuf==NULL))
- {
- return -1;
- }
- int i = 0, count = 0;
- while(i < utf8Leng)
- {
- i += UTF82UnicodeOne(utf8Buf + i, pUniBuf[count]);
- count ++;
- }
- return count;
- }
- inline int Unicode2UTF8One(unsigned wchar, char *utf8)
- {
- if (utf8==NULL)
- {
- return -1;
- }
- int len = 0;
- if (wchar < 0xC0)
- {
- utf8[len ++] = (char)wchar;
- }
- else if (wchar < 0x800)
- {
- utf8[len ++] = 0xc0 | (wchar >> 6);
- utf8[len ++] = 0x80 | (wchar & 0x3f);
- }
- else if (wchar < 0x10000)
- {
- utf8[len ++] = 0xe0 | (wchar >> 12);
- utf8[len ++] = 0x80 | ((wchar >> 6) & 0x3f);
- utf8[len ++] = 0x80 | (wchar & 0x3f);
- }
- else if (wchar < 0x200000)
- {
- utf8[len ++] = 0xf0 | ((int)wchar >> 18);
- utf8[len ++] = 0x80 | ((wchar >> 12) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 6) & 0x3f);
- utf8[len ++] = 0x80 | (wchar & 0x3f);
- }
- else if (wchar < 0x4000000)
- {
- utf8[len ++] = 0xf8 | ((int)wchar >> 24);
- utf8[len ++] = 0x80 | ((wchar >> 18) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 12) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 6) & 0x3f);
- utf8[len ++] = 0x80 | (wchar & 0x3f);
- }
- else if (wchar < 0x80000000)
- {
- utf8[len ++] = 0xfc | ((int)wchar >> 30);
- utf8[len ++] = 0x80 | ((wchar >> 24) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 18) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 12) & 0x3f);
- utf8[len ++] = 0x80 | ((wchar >> 6) & 0x3f);
- utf8[len ++] = 0x80 | (wchar & 0x3f);
- }
- return len;
- }
- //
- int Unicode2UTF8( const wchar_t *pUniBuf,char* utf8Buf, int UniLeng)
- {
- if ((utf8Buf==NULL)||(pUniBuf==NULL))
- {
- return -1;
- }
- int count = 0, i = 0;
- while(i < UniLeng)
- {
- count += Unicode2UTF8One(pUniBuf[i], utf8Buf+count);
- i ++;
- }
- return count;
- }
- int main()
- {
- boost::property_tree::ptree pt;
- using boost::property_tree::wptree;
- wptree wpt;
- boost::property_tree::ini_parser::read_ini("D:\\Overlay.ini", pt);
- std::string fontName=pt.get<std::string>("OVERLAY.OverlayFontName") ;
- wchar_t wfontName[128]={0};
- UTF82Unicode(fontName.c_str(),wfontName,fontName.length());
- std::wstring wstrfontName=wfontName;
- //std::wcout << wstrfontName.c_str()<< std::endl;
- /*std::wstring */
- wstrfontName=_T("我是谁");
- char cfontName[128]={0};
- Unicode2UTF8(wstrfontName.c_str(),cfontName,wstrfontName.length());
- pt.put<std::string>("OVERLAY.OverlayFontName",cfontName);
- //std::cout << pt.get<std::string>("OVERLAY.OverlayFontName") << std::endl;
- boost::property_tree::ini_parser::write_ini("D:\\Overlay.ini",pt);
- return 0;
- }
boost::property_tree读取解析ini文件--推荐的更多相关文章
- C++ 中使用boost::property_tree读取解析ini文件
boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是 ...
- boost::property_tree读取解析.xml文件
boost::property_tree读取解析.xml文件 1)read_xml 支持中文路径 boost::property_tree::wptree wpt; std::locale:: ...
- 实战parse_ini_file()及扩展函数解析ini文件完整版
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/587 在PHP站点开发的过程中,往往会用到读取ini參数配置文件,比方须要訪问一些复杂的借 ...
- python解析ini文件
python解析ini文件 使用configparser - Configuration file parser sections() add_section(section) has_section ...
- shiro解析ini文件
来吧,看看shiro是怎么解析ini文件的,这里假设ini文件在classpath下,名字叫做shiro.ini Factory<org.apache.shiro.mgt.SecurityMan ...
- 解决ini-parser解析ini文件中文乱码问题
rickyah/ini-parser 是一个.net 平台解析ini文件的库,当ini文件中含有中文字符时会乱码. 解决:将文件通过Editplus 等文本编辑工具保存为 utf-8 + bom 格式 ...
- boost::property_tree 读取ini配置
应用场景: 在后端服务器项目开发中,需要初始化一个Socket服务器,需要IP地址与对应端口号等参数:另外还可能因为对接数据库,就还需要数据库的相关配置参数,如我使用的是MySql数据库,就需要数据库 ...
- boost.property_tree读取中文乱码问题正确的解决方式
开发项目的时候在使用boost,在宽字符下遇到中文乱码问题 上网上看大家都是先转成utf8在进行解析的,例如: http://blog.csdn.net/hu_jiangan/article/deta ...
- C语言实现 读取写入ini文件实现(转)
#include <stdio.h> #include <string.h> /* * 函数名: GetIniKeyString * 入口参数: title * 配置文件中一组 ...
随机推荐
- Qt 技巧:设置在 debug 路径下直接运行可执行文件
Qt 编译的时候默认会使用影子构建,这时在工作路径下会生成一个目录:xxx-build-desktop-xxx. 如果编译通过,在该目录下会生成一个可执行文件,双击之,但不能运行,提示是缺少某个动态库 ...
- wchar_t*和char*之间的互相转换的那些事
最近在看一写PE文件格式的东西,想做一个读取PE文件信息的小工具,中间遇到将LPVOID格式无法转换到LPTSTR格式,强制转换屡试屡败,多显示乱码.我们知道LPVOID格式可以直接转换到char * ...
- 11427 - Expect the Expected(概率期望)
11427 - Expect the Expected Some mathematical background. This problem asks you to compute the expec ...
- C++ 表达式语句 海伦的故事
C++ 表达式语句 海伦的故事 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 把今天当成最后一天来过.-海伦 请读者在 ...
- 横瓜先生如何用MDB和XLS等低性能数据库来处理千亿级数据量。
横瓜先生如何用MDB和XLS等低性能数据库来处理千亿级数据量. 横瓜先生曾经用ACCESS做数据库,开发出高性能CMS来处理过TB级的文本数据量,任何请求都可以在10MS内完成,基本就是硬盘延迟的时间 ...
- ExtJS学习第一天 MessageBox
此文用来记录学习笔记: •学习任何技术,首先都要从Helloworld开始,那么我们首要任务就是写一个简单的HelloWorld程序,带领同学们走进ExtJS的世界. •Ext.onReady:这个方 ...
- C# lazy<T>的用法
.NET 4.0中加入了lazy<T>(懒对象),其实叫懒对象感觉不对,更应该叫延迟对象加载. 正如我们所知,对象的加载是需要消耗时间的,特别是对于大对象来说消耗的时间更多.lazy可以实 ...
- C#学习之-----再论委托
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 再见了acm
2013年11月17日长沙区域赛我的最后一场区域赛. 忙碌了三年的acm要停下脚步,一时还无法接受. 这样一个结果有点无奈. 感谢队友,三年三支队伍五个队友,感谢你们.(每当写到这里时就总有点小忍不住 ...
- Python 第十三篇之一:前端页面 js和dome
一:JavaScript: JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的 ...