随手写个解析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配置文件分析小例子的更多相关文章

  1. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  2. Spring aop 小例子demo

    由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施.完成学习的小例子. 关于spring-Aop原理:http://m.oschina.net/blog ...

  3. php.ini配置文件参数中文说明文档

    转自  https://blog.csdn.net/seoyundu/article/details/101147041 中文翻译php.ini配置文件 [PHP php.ini-dist] ;;;; ...

  4. MySQL配置文件my.cnf 例子最详细翻译

    转的 MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载 ...

  5. Runtime的几个小例子(含Demo)

    一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runti ...

  6. 【个人使用.Net类库】(1)INI配置文件操作类

    开发接口程序时,对于接口程序配置的IP地址.端口等都需要是可配置的,而在Win Api原生实现了INI文件的读写操作,因此只需要调用Win Api中的方法即可操作INI配置文件,关键代码就是如何调用W ...

  7. spring小例子-springMVC+mybits整合的小例子

    这段时间没更博,找房去了...   吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了..   搬家太 ...

  8. 五个小例子教你搞懂 JavaScript 作用域问题

    众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者 ...

  9. lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)

    lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能)   添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...

随机推荐

  1. python学习:环境搭建

    1.图解eclipse环境下安装python3.x插件支持:http://www.tuicool.com/articles/M3Afyu 其中如果 然后,选择Add按钮,Name:Python3,Lo ...

  2. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  3. 使用JDBC访问SQLServer 2008

    使用JDBC访问SQLServer 2008 // 准备数据库驱动程序 String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriv ...

  4. This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms while caching 问题及解决

    一.背景    情节1:做别的测试安装下载了软件,妈蛋结果下了百度各种捆绑软件,之后一一卸载,清洁.    情节2:做完上述动作重启电脑后,有线连接连不上,尴尬,然后下载驱动,升级之后ok了. 二.问 ...

  5. MySql无限分类数据结构--预排序遍历树算法

    MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...

  6. iOS图片模糊效果与阴影效果

    /** 添加图片模糊效果 @parms  要添加模糊效果的view @return */ + (UIVisualEffectView *)addVisualEffectViewWithView:(UI ...

  7. ADURL简化程序

    using System; using System.Diagnostics; using System.Net; using System.Text; using System.Web; using ...

  8. MFC中无边框窗口的拖动

      void CXXXXDialog::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTI ...

  9. 论Segmentation fault

    刚开始学c的时候,最头疼的事情是编译总是通不过,郁闷的要死,只要编译通过了,就兴奋的要死.现在,最头疼的事情是什么呢,编译没问题,但是程序跑的时候会出现Segmentation fault! 这个东西 ...

  10. 在php里写sql查询需要注意的事情

    ---恢复内容开始--- 今天往php里写了一条sql查询, $sql = "select * from videos where vuser=".$u: $ret = mysql ...