key_value 类型配置文件的解析

 1 #include <iostream>
 2 #include <string>
 3 #include <stdint.h>
 4 #include <map>
 5 #include <fstream>
 6 #include <stdlib.h>
 7 #include <stdio.h>
 8
 9 enum
10 {
11     enmMaxConfigWordLen = 32,
12 };
13
14 typedef std::map<std::string,std::string> ATTRMAP;
15
16
17 void GetTextFileContent(const char *fileName,char buf[],const uint32_t maxBufLen,uint32_t &readBufLen)
18 {
19     std::ifstream file(fileName,std::ios::in);
20     if(!file)
21     {
22         return ;
23     }
24     char c;
25     readBufLen = 0;
26     while(file.get(c) && readBufLen < maxBufLen)
27     {
28         if(c != ‘\n‘ && c != ‘ ‘ && c != 9)
29         {
30             buf[readBufLen++] = c;
31         }
32     }
33     buf[readBufLen]=‘\0‘;
34 }
35
36 void GetAllAttrFromStr(const char *buf,const uint32_t bufLen,ATTRMAP &attrMap)
37 {
38     char key[enmMaxConfigWordLen],value[enmMaxConfigWordLen];
39     int32_t flag = 0,len = 0;       //0->key,1->value
40     for(uint32_t i = 0;i < bufLen; ++i)
41     {
42         const char &c = buf[i];
43         switch(c)
44         {
45         case ‘{‘:flag=0;break;
46         case ‘}‘:
47             value[len] = ‘\0‘;
48             attrMap[key] = value;
49             break;
50         case ‘:‘:
51             key[len] = ‘\0‘;
52             len = 0;
53             flag = 1;
54             break;
55         case ‘,‘:
56             value[len] = ‘\0‘;
57             len = 0;
58             flag = 0;
59             attrMap[key] = value;
60             break;
61         default:
62             if( flag == 0 )
63             {
64                 key[len++] = c;
65             }
66             else if( flag == 1 )
67             {
68                 value[len++] = c;
69             }
70             break;
71         }
72     }
73 }
74
75
76 int32_t main()
77 {
78     const uint32_t maxFileBufLen = 1024;
79     char buf[maxFileBufLen];
80     uint32_t bufLen;
81     GetTextFileContent("dbconfig.cfg",buf,maxFileBufLen,bufLen);
82     ATTRMAP attrMap;
83     GetAllAttrFromStr(buf,bufLen,attrMap);
84     std::string szHost = attrMap["host"];
85     std::string szUsr = attrMap["user"];
86     std::string szPasswd = attrMap["passwd"];
87     std::string szDbName = attrMap["dbname"];
88     std::string szTableName = attrMap["tablename"];
89     uint32_t unPort = atol(attrMap["port"].c_str());
90     printf("szHost = ‘%s‘\nszUsr = ‘%s‘\nszPasswd = ‘%s‘\nszDbName = ‘%s‘\nszTableName = ‘%s‘\nunPort = %d\n",91         szHost.c_str(),szUsr.c_str(),szPasswd.c_str(),szDbName.c_str(),szTableName.c_str(),unPort);
92     return 0;
93 }

测试文件:

{
    host:192.168.75.134,
    port:3306,
    user:sdo,
    passwd:123456,
    dbname:sdo_config,
    tablename:sdo_item
}

测试结果:

szHost = ‘192.168.75.134‘
szUsr = ‘sdo‘
szPasswd = ‘123456‘
szDbName = ‘sdo_config‘
szTableName = ‘sdo_item‘
unPort = 3306
时间: 2024-10-25 07:18:56

key_value 类型配置文件的解析的相关文章

mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

相关文章推荐 mybatis 缓存的使用, 看这篇就够了 mybatis源码-解析配置文件(四)之配置文件Mapper解析 1. 简介 本文章主要讲解的是, xxxMapper.xml 文件中, cache 节点的源码. 2. 解析 XMLMapperBuilder.cacheElement() 方法主要负责解析 <cache> private void cacheElement(XNode context) throws Exception { if (context != null) {

使用gSoap规避和修改ONVIF标准类型结构的解析

ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分的支持:基于C/C++开发,则需要借助gSoap生成这之间的交互接口调用的代码. gSoap生成代码 wsdl2h 将服务接口描述转换为soapcpp2的转换规则,生成中间头文件. 通常我们前期会选择实现部分服务标准:因此这期间生成的后续多为修改这次生成中间产物.h,而不会一切重新生成. soapc

第三方控件引起的"类型Universe无法解析程序集"的血案

前一阵子在项目中添加了IrisSkin2皮肤控件,今天用VS打开悲剧了. 提示"类型Universe无法解析程序集:System.Design,Version=2.0.0.0,Culture=neutral,PublickeyToken=b03f5f7f11d50a3a".这是因为vs2010新建工程时应用程序默认目标框架为.Net Framework 4 Client Profile,该选项为微软对.NET Class Library的减肥版,缺少第三方控件需要的组件引用. 解决方案

java内存分配和String类型的深度解析(转)

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析 关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBu

【转】java内存分配和String类型的深度解析

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBui

Java内存分配和String类型的深度解析

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBui

解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几种不同的date相关类型,当前OrcaMDF 支持三种最常用的date类型:date,datetime,smalldatetime SqlDate实现 date 类型在三种类型之中是最简单的,他是一个3个字节的定长类型,存储了日期值它支持的日期范围从0001-01-01到9999-12-31 默认值

各类型液晶电视面板解析

各类型液晶电视面板解析 对于液晶电视来说,液晶面板占整机70%-80%的成本,液晶电视最重要的部件就是液晶面板,也就是液晶屏幕.液晶面板技术的高低和质量的好坏关系到整个液晶电视的功能参数.显示效果和使用寿命等情况.面板的类型决定了面板的大部分参数的水平,例如分辨率.对比度.响应时间.可视角度等等方面.由此,液晶电视与液晶面板二者是密切相关的,不可分割的. 液晶面板作为液晶电视性能中最为关键的组成部分,同时也是掌握液晶电视上游核心技术关键.而液晶面板技术都集中在外资彩电厂商手中.目前主要以三星.索

关于数组类型的json解析方法

遇到了很奇葩的数组类型的json,一时解析不出来,用jsonObject会直接报错. Json数据如: [{"id":"1000142","name":"\u5168\u90e8\u7c7b\u578b","subMenu":[{"id":"1000135","name":"\u591a\u5a92\u4f53\u8bbe\u8ba1&q