c++中解析ini 文件的simpleIni库
simpleIni库简介:一个跨平台库,它提供了一个简单的 API 来读取和写入 INI 样式的配置文件。它支持 ASCII、MBCS 和 Unicode 中的数据文件。它被明确设计为可移植到任何平台,并已在Windows,WinCE和Linux上进行了测试。使用MIT许可证以开源和免费的方式发布。功能:1】加载和保存 INI 样式的配置文件2】自由接受文件格式3】支持char或wchar_t变成
simpleIni库简介:
一个跨平台库,它提供了一个简单的 API 来读取和写入 INI 样式的配置文件。
它支持 ASCII、MBCS 和 Unicode 中的数据文件。它被明确设计为可移植到任何平台,
并已在Windows,WinCE和Linux上进行了测试。使用MIT许可证以开源和免费的方式发布。
功能:
1】加载和保存 INI 样式的配置文件
2】自由接受文件格式
3】支持char或wchar_t变成接口
4】通过用户编写的转换器类支持非标准字符类型或文件编码
5】支持以编程方式添加/修改值
6】简单编译,没有告警
如何使用编译:
下载网址: simpleini/README.md at master ·布罗菲尔德/简单尼 ·GitHub
simpleini · PyPI https://pypi.org/project/simpleini/
包含的文件: 红色中都是我们需要的:
创建个文件夹把这两个 ".h"包含在内然后再实现自己所需的cpp文件接口进行编译即可;
C++ C混合编译不要忘记
#ifdef __cplusplus
extern "C" {
#endif
/*实现 */
#ifdef __cplusplus
}
#endif
INI文件示例:
[Cfg0]
Period = 5000
flag = 1
Num = 1
StartNum = 3
dlNum = 2
ulNum = 2
调用读取示例:
//c++示例
CSimpleIniA ini;
SI_Error rc; //结构在simpleIni.h中定义了
rc = cfgini.LoadFile("xxx.ini"); //加载文件
period = cfgini.GetLongValue ("Cfg0", "Period ", 5); //读取Cfg0节点中的 Period 属性,如果没有这个节点的话默认值是5;
// 类似的接口 GetDoubleValue GetBoolValue SetValue SetLongValue 等;
rc = cfgini.SetLongValue("Cfg0", "Period ", 6, "Period");
常用接口:
1、加载文件
// load from a data file
CSimpleIniA ini;
SI_Error rc = ini.LoadFile("example.ini");
2、获取值
ini.GetLongValue("Cfg0", "Period ", 5);
ini.GetValue("section1", "key99");
3、修改数据
ini.SetValue("section1", nullptr, nullptr);
rc = cfgini.SetLongValue("Cfg0", "Period ", 6, "Period");
4、删除数据
ini.Delete("Cfg0", "Period ");
done = ini.Delete("section2", nullptr);
5、保存数据
// save the data to a string
std::string data;
rc = ini.Save(data);
举例:
config.cpp用来实现我们需要用到的接口:
/******************************************************************************
config ini访问接口,提供最基本的读写访问
将此文件编译成动态包,此文件作为访问config.ini的实现开放接口在config.h中声明
其他调用需要连接编译出来的动态库并包含头文件config.h即可
******************************************************************************/
#include "SimpleIni.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "stdio.h"
typedef struct {
unsigned int Period;
unsigned int flag;
unsigned short dlNum;
unsigned char dlNums;
unsigned char rsv0;
unsigned short ulNum;
unsigned char ulNums;
unsigned char rsv1;
} CFG_INI_STRU;
CSimpleIniA cfgini;
SI_Error err; //这个枚举在SimpleIni.h中有定义
CFG_INI_STRU cfg[2];
int BSP_ConfigLoadAll(char * path)
{
err = cfgini.LoadFile(path);
return err;
}
/* 简单提供接口 */
void get_node(void)
{
cfg[0].transPeriod = cfgini.GetLongValue("Cfg0", "Period", 0);
cfg[0].enflag = cfgini.GetLongValue("Cfg0", "flag", 1);
cfg[0].dlSlotsNum = cfgini.GetLongValue("Cfg0", "dlNum", 3);
cfg[0].dlSymbolsNum = cfgini.GetLongValue("Cfg0", "dlNums", 10);
cfg[0].ulSlotsNum = cfgini.GetLongValue("Cfg0", "ulNum", 1);
cfg[0].ulSymbolsNum = cfgini.GetLongValue("Cfg0", "ulNums", 2);
printf("Period : %d \n", cfg[0].Period);
printf("flag : %d \n", cfg[0].flag);
printf("dlNum : %d \n", cfg[0].dlNum);
printf("Nums : %d \n", cfg[0].dlNums);
printf("ulNum : %d \n", cfg[0].ulNum);
printf("ulNums : %d \n", cfg[0].ulNums);
}
#ifdef __cplusplus
}
#endif
config.h 声明开发的接口
#ifndef CONFIG_INI_H
#define CONFIG_INI_H
int BSP_ConfigLoadAll(char * path);
void get_node(void);
#endif
config.ini 定义的配置文件
[frameCfg0]
Period = 5000
flag = 1
dlNum = 7
dlNums = 6
ulNum = 2
ulNums = 4
test_ini.c 测试实现的接口
//测试调用读取config.ini接口
#include<stdio.h>
#include "config.h"
int BSP_ConfigLoadAll(char * path);
void get_node(void);
int main(int argc, char *argv[])
{
int ret = 0;
char * path ;
if (argc < 2)
{
printf("Usage : test /home/cj");
return -1;
}
path = argv[1];
ret = BSP_ConfigLoadAll(path);
if (ret){
printf("ret:%d failed can't %s \n", ret, path);
}
get_node();
return 0;
}
makefile:
#exprot LD_LIBRARY_PATH=自己的配置文件路径
TARGET = libbspRru.so
CXX := g++
OBJS := config.o
CFLAGS = -std=c++11 -fno-pie -O2 -Wall -shared -fPIC
CC = gcc
.PHONY :all
all:$(TARGET)
$(TARGET): $(OBJS)
$(CXX) -shared -o $@ $^
%.o : %.cpp
$(CXX) -c $< $(CFLAGS)
.PHONY :clean
clean:
rm *.o *.so *.gch -f test
.PHONY:test
test:test_ini.o
$(CC) -o $@ $^ -lbspRru -L 包含自己的配置文件路径
编译测试:
make
make test
有告警是CFLAGS引起的,编译c文件的时候没有-std=c++11的选项 ,编译的时候默认选择CFLAGS宏,默认时这个是空的,我们赋值了,所以有告警,不影响,也可以修改先makefile去除;把-std=c++11放到 %.o : %.cpp的命令中去,懒得修改测试截图了;
测试执行前先执行:
exprot LD_LIBRARY_PATH=自己的配置文件路径 很重要不然可能找不到动态库
这样就基本成功了。
更多推荐
所有评论(0)