INI配置文件分析小例子
随手写个解析INI配置字符串的小例子 带测试
#include <iostream>
#include <map>
#include <string>
#include "unittest.h" bool IniParser(std::string inputStr,std::map<std::string,std::string>& keyValueMap){
bool ret = false;
size_t keyStart = 0; for(keyStart= 0 ;keyStart < inputStr.size();keyStart++){
if(inputStr[keyStart] == ' '){
continue; //去除空格
}else if( inputStr[keyStart] == ';' || inputStr[keyStart] == '#' ||
inputStr[keyStart] == '[' || inputStr[keyStart] == ']' || inputStr[keyStart] == '='){
return ret; // 各种意外开头 直接返回失败
}else{
break;
}
}
size_t findPos = inputStr.find_first_of("=",keyStart);
if(std::string::npos == findPos){
return ret;//没有找到"="
}
std::string keyString = inputStr.substr(keyStart,findPos -keyStart); // std::cout << "keyString:" << keyString << std::endl; for(keyStart= findPos+1 ;keyStart < inputStr.size();keyStart++){
if(inputStr[keyStart] == ' '){
continue; //去除空格
}else{
break;
}
} std::string valueString = inputStr.substr(keyStart); //std::cout << "valueString:" << valueString << std::endl; keyValueMap.insert(std::pair<std::string,std::string>(keyString,valueString));
ret = true;
return ret;
} std::string testStr1 = "key=value";
std::string testStr2 = " key = value"; std::string testStr3 = "# key=value";
std::string testStr4 = "== key=value";
std::string testStr5 = "[ 23423key=value";
std::string testStr6 = "]324234key=value";
std::string testStr7 = ";key= = value";
std::string testStr8 = " key = = value"; int main(int argc, char *argv[])
{ std::map<std::string,std::string> keyValueMap; EXCEPT_EQ( IniParser(testStr1,keyValueMap),true);
EXCEPT_EQ( IniParser(testStr2,keyValueMap),true);
EXCEPT_EQ( IniParser(testStr3,keyValueMap),false);
EXCEPT_EQ( IniParser(testStr4,keyValueMap),false);
EXCEPT_EQ( IniParser(testStr5,keyValueMap),false);
EXCEPT_EQ( IniParser(testStr6,keyValueMap),false);
EXCEPT_EQ( IniParser(testStr7,keyValueMap),false);
EXCEPT_EQ( IniParser(testStr8,keyValueMap),true); PRINT_TEST_RESULT();
return 0;
}
测试头文件
#ifndef UNITTEST_H
#define UNITTEST_H
#include <iostream> class MyTestClass {
static size_t testCount_;
static size_t testPass_;
public:
template<typename E,typename A>
bool ExceptEqual(E e, A a)
{
testCount_++;
if (e == a){
testPass_++;
return true;
}
return false;
} void PrintResult(){
std::cout << testPass_ << "/" << testCount_ << "\t" << "("<<(testPass_ * 100.0 / testCount_) << "%)" << " passed." << std::endl;
}
};
size_t MyTestClass::testCount_ = 0;
size_t MyTestClass::testPass_ = 0; #define ERROR_PRINT(expect,actual) \
std::cerr << __FILE__ <<":"<< __LINE__ << "\r\nexpect: " << expect << " actual: " << actual << std::endl; #define EXCEPT_EQ(expect, actual) \
do{ \
MyTestClass TEST; \
if(!TEST.ExceptEqual(expect, actual)){ \
ERROR_PRINT(expect,actual) \
} \
}while(0) #define PRINT_TEST_RESULT() \
do{ \
MyTestClass TEST; \
TEST.PrintResult(); \
}while(0) #endif // UNITTEST_H
INI配置文件分析小例子的更多相关文章
- 使用Trinity拼接以及分析差异表达一个小例子
使用Trinity拼接以及分析差异表达一个小例子 2017-06-12 09:42:47 293 0 0 Trinity 将测序数据分为许多独立的de Brujin grap ...
- Spring aop 小例子demo
由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施.完成学习的小例子. 关于spring-Aop原理:http://m.oschina.net/blog ...
- php.ini配置文件参数中文说明文档
转自 https://blog.csdn.net/seoyundu/article/details/101147041 中文翻译php.ini配置文件 [PHP php.ini-dist] ;;;; ...
- MySQL配置文件my.cnf 例子最详细翻译
转的 MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载 ...
- Runtime的几个小例子(含Demo)
一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.) 1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数); [runti ...
- 【个人使用.Net类库】(1)INI配置文件操作类
开发接口程序时,对于接口程序配置的IP地址.端口等都需要是可配置的,而在Win Api原生实现了INI文件的读写操作,因此只需要调用Win Api中的方法即可操作INI配置文件,关键代码就是如何调用W ...
- spring小例子-springMVC+mybits整合的小例子
这段时间没更博,找房去了... 吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了.. 搬家太 ...
- 五个小例子教你搞懂 JavaScript 作用域问题
众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者 ...
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)
lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能) 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...
随机推荐
- TransactionScope类的使用
如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体 ...
- pdf 切割成圖片的方法
/// <summary> /// 将PDF文档转换为图片的方法 /// </summary> /// <param na ...
- [C]遍历目录下所有文件
#include<iostream>#include<string.h>#include<io.h>FILE *fp;using namespace std;voi ...
- Orchard分类Taxonomies图文教程
Orchard分类和标签都实现对内容的分类管理,两者区别是分类的子项之间是具有级别(同级.上下级)关系,而标签是很随意的,子项之间可以有关系也可以没有,今天给大家分享分类的使用方法. 一.环境说明 O ...
- 39、重新复习js之三
1.盒子模型典型标签 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...
- linux学习8 第八章 权限管理
8.1 ACL权限 8.2 文件特殊权限 8.3 文件系统属性chattr权限 8.4 系统命令sudo权限 8.1 ACL权限 ACL权限简介与开启 查看与设定ACL权限 最大有效权限与删除ACL权 ...
- C# Iterator迭代器的实现方式
C#发展到今天又三种方式实现迭代: 1.非泛型非 yield,这个较简单,代码如下: using System; using System.Collections.Generic; using Sys ...
- BIRT报表工具,直接导出EXCEL
BIRT是一款基于JAVA的免费开源报表工具,使用起来也挺方便. 有时你可能不需要在浏览器中展示报表,然后在点击导出按钮保存为EXCEL, 这里提供一种方式,直接把报表导出为EXCEL下载. JS代码 ...
- swift 之 闭包
一.闭包 格式:{ ( 参数名:类型, 参数名:类型 .. ) in 内容体 return 返回值 } 最完整的闭包 1.省略参数类型 { ( 参数名, 参数名.. ) ...
- nginx + lua +redis环境搭建
环境搭建,其实主要是lua的环境,这个环境够麻烦的,在网上找了很多前辈的文章,终于完成了 ,安装redis wget http://download.redis.io/releases/redis-3 ...