c++中解析ini 文件的simpleIni库

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/

包含的文件: 红色中都是我们需要的: 

c++中解析ini 文件的simpleIni库_第1张图片

创建个文件夹把这两个 ".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
#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=自己的配置文件路径 很重要不然可能找不到动态库

c++中解析ini 文件的simpleIni库_第2张图片

这样就基本成功了。

你可能感兴趣的:(linux驱动,c++,linux)