【iniparser】项目配置工具iniparser的简单使用

简介: 【iniparser】项目配置工具iniparser的简单使用

项目配置工具iniparser

前言

 对于很多程序中要用的参数如果是可变的,那么最好的处理方式就是通过main函数进行参数传递,或者从别的地方去获取,这其中之一的做法就是使用配置文件,在一个成熟和架构完善的系统中,一般都会做到自动配置,自动部署。

 所以有的系统里会有一个单独的配置服务存在,其它的每个服务配置都会从配置中心服务获取。

 运维人员会通过操作界面把配置信息下发到配置中心服务,其余服务从配置中心获取变更信息。

几乎每个大型互联网项目都会涉及到项目配置


安装与构建

  • git clone
git clone https://github.com/ndevilla/iniparser.git
  • cd iniparser
  • make
  • 编译生成,.a为静态库,.so为动态库
  • image-20220722221802109

测试

  • 本测试项目目录树。
share_bike
|-- conf
|   `-- share_bike.ini
|-- git
|   `-- iniparser
|       |--略
|-- src
|   |-- CMakeLists.txt
|   |-- common
|   |   |-- CMakeLists.txt
|   |   |-- configdef.h
|   |   |-- iniconfig.cpp
|   |   |-- iniconfig.h
|   |-- main.cpp
|-- test
`-- third
   |-- include
   |   `-- iniparser
   |       |-- dictionary.h
   |       `-- iniparser.h
   `-- lib
       `-- iniparser
           |-- libiniparser.a
           `-- libiniparser.so.1
  • 注意:ubuntu下可以使用tree命令打印目录树。 tree
sudo apt-get install tree

  • /src/common/configdef.h
#ifndef SHBK_COMMON_CONFIGDEF_H_
#define SHBK_COMMON_CONFIGDEF_H_

#include <string>

typedef struct st_env_config{

    //数据库的配置
    std::string db_ip;
    unsigned short db_port;
    std::string db_user;
    std::string db_pwd;
    std::string db_name;

    //服务器的配置
    unsigned short svr_port;

    //构造函数
    st_env_config(){

    }

    st_env_config(const std::string& db_ip, unsigned int db_port, const std::string& db_user,
                 const std::string& db_pwd, const std::string& db_name, unsigned short svr_port){
       this->db_ip    = db_ip;
       this->db_port  = db_port;
       this->db_user  = db_user;
       this->db_pwd   = db_pwd;
       this->db_name  = db_name;
       this->svr_port = svr_port;
   }

    st_env_config& operator =(const st_env_config& config){
       if (this != &config){
           this->db_ip    = config.db_ip;
           this->db_port  = config.db_port;
           this->db_user  = config.db_user;
           this->db_pwd      = config.db_pwd;
           this->db_name  = config.db_name;
           this->svr_port = config.svr_port;
        }
        return *this;
    }
}_st_env_config;
#endif
  • /src/common/iniconfig.h
#ifndef SHBK_COMMON_INICONFIG_H_
#define SHBK_COMMON_INICONFIG_H_

#include <string>
#include "configdef.h"

class Iniconfig{
public:
    Iniconfig();
    ~Iniconfig();

    //加载配置    
    bool loadfile(const std::string& path);
    //获取配置
    const st_env_config& getconfig();

private:
    st_env_config _config;
    bool _isloaded;

};

#endif //SHBK_COMMON_INICONFIG_H_
  • /src/common/iniconfig.cpp
#include "iniconfig.h"
#include <iniparser/iniparser.h>

Iniconfig::Iniconfig():_isloaded(false){
}

Iniconfig::~Iniconfig(){
}

bool Iniconfig::loadfile(const std::string& path){
    dictionary* ini = NULL;
    ini = iniparser_load(path.c_str());
    if(ini == NULL){
        fprintf(stderr,"cannot parse file:%s\n",path.c_str());
        return false;
    }
    
    //拿到信息,字典,——区段:区段中的信息,默认值(如果没找到就取这个默认值)
    const char* ip = iniparser_getstring(ini,"database:ip","127.0.0.1");
    const int   port  = iniparser_getint(ini, "database:port", 3306);
    const char* user  = iniparser_getstring(ini, "database:user", "root");
    const char* pwd   = iniparser_getstring(ini, "database:pwd", "123456");
    const char* db    = iniparser_getstring(ini, "database:db", "dongnaobike");
    const int   sport = iniparser_getint(ini, "server:port", 9090);

    //信息赋值
    _config = st_env_config(std::string(ip), port, std::string(user),
        std::string(pwd), std::string(db), sport);

    //释放字典资源
    iniparser_freedict(ini);
    _isloaded = true;
    return  _isloaded;
}
const st_env_config& Iniconfig::getconfig(){
    return _config;
}
  • /src/common/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 搜集所有在指定路径下的源文件的文件名,将输出结果存储在指定的变量中
aux_source_directory(. SOURCES_COMMON_FILES)

# 构建库供其他模块使用
ADD_LIBRARY(common ${SOURCES_COMMON_FILES})

# 用来显式的定义变量
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")

# 将指定目录添加到编译器的有文件搜索路径之下
INCLUDE_DIRECTORIES(../../third/include)

# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../../third/lib/iniparser)

# 将目标文件与库文件进行链接
TARGET_LINK_LIBRARIES(common iniparser)
TARGET_LINK_LIBRARIES(common dl)
  • /src/main.cpp
#include "iniconfig.h" //注意路径,会在CMake中进行调整
#include "configdef.h"

int main(int argc,char** argv){

    if(argc != 2){//缺少参数
        printf("Please input shbk <config file path>!\n");
        return -1;
    }

    Iniconfig config;
    if(!config.loadfile(std::string(argv[1]))){
        printf("load %s failed.\n",argv[1]);
        return -2;
    }

    //测试是否读取成功
    st_env_config conf_args = config.getconfig();
    printf("[database]ip:%s\n [database]port:%d\n [database]user:%s\n [database]pwd:%s\n [database]db:%s\n [server]port:%d\n ",
                conf_args.db_ip.c_str(),
                conf_args.db_port,
                conf_args.db_user.c_str(),
                conf_args.db_pwd.c_str(),
                conf_args.db_name.c_str(),
                conf_args.svr_port);
    return 0;
}
  • /src/CMakeLists.txt
# CMake要求最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 工程名
PROJECT(share_bike)

# 将指定目录添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(../third/include)
INCLUDE_DIRECTORIES(./common)

# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../third/lib/iniparser)
# 刚才在子文件夹中生成的库
LINK_DIRECTORIES(./common)

# 搜集所有在指定路径下的源文件的文件名,将输出的结果列表存储在指定的变量中
# 内置变量CMAKE_SOURCE_DIR 定义了顶级CMakeLists.txt所在的文件夹
# PROJECT_SOURCE_DIR 定义了包含最近的project()命令的CMakeLists.txt 所在的文件夹
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)

# 使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(share_bike ${SOURCE_FILES})

# GCC编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")

TARGET_LINK_LIBRARIES(share_bike iniparser)
TARGET_LINK_LIBRARIES(share_bike common)

# 增加子目录
ADD_SUBDIRECTORY(common)

SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
INSTALL(TARGETS share_bike DESTINATION bin)
  • /conf/share_bike.ini
[database]
ip       = 127.0.0.1 ;
port     = 3306 ;
user     = root ;
pwd      = 123456 ;
db       = qiniubike;

[server]
port     = 9090;
  • 编译,在/src目录下
cmake .
make 
  • 执行
./share_bike ../conf/share_bike.ini

image-20220724224006702

相关文章
|
小程序 Java 关系型数据库
网球爱好者小程序的设计与实现
网球爱好者小程序的设计与实现
683 0
|
机器学习/深度学习 PyTorch 算法框架/工具
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
1776 0
|
测试技术
通义千问团队开源全新的过程奖励模型PRM!
近年来,大型语言模型(LLMs)在数学推理方面取得了显著进展,但它们仍可能在过程中犯错误,如计算错误或逻辑错误,导致得出不正确的结论;即使最终答案正确,这些强大的模型也可能编造看似合理的推理步骤,这削弱了 LLMs 推理过程的可靠性和可信度。
1590 14
|
11月前
|
搜索推荐 算法 大数据
基于python大数据的旅游景点可视化与推荐系统
本系统基于大数据与网络技术,构建个性化旅游推荐平台。通过收集用户偏好及行为数据,结合机器学习算法,提供精准的旅游目的地、住宿及交通推荐,旨在优化旅游信息传递,提升用户决策效率与旅行体验。
|
运维 监控 数据可视化
WGCLOUD主机管理系统 v3.5.7 更新功能说明
WGCLOUD 是一款开源免费的分布式运维监控平台,具备集群监控、易部署、轻量高效等特性。核心功能涵盖主机系统、CPU、内存、网络、磁盘、Docker、日志等全方位监控,并提供数据可视化、拓扑图、告警推送(邮件、钉钉、微信)等功能。最新版 v3.5.7 增强了 Docker 容器监控、自定义告警、背景主题设置及多项优化和修复。 下载链接:[WGCLOUD](http://www.wgstart.com) GitHub 仓库:[https://github.com/tianshiyeben/wgcloud](https://github.com/tianshiyeben/wgcloud)
|
测试技术 C语言
分享一个好用的C语言.ini文件的解析库
分享一个好用的C语言.ini文件的解析库
1035 0
|
Ubuntu 开发工具 C++
Ubuntu 22.04上编译安装c++ libconfig library
通过本文的介绍,我们详细讲解了如何在Ubuntu 22.04上编译和安装libconfig库,并通过编写和运行一个简单的测试程序来验证安装是否成功。libconfig库的安装过程相对简单,主要包括环境准备、下载源码、编译和安装几个步骤。希望本文对您在项目中使用libconfig库有所帮助。
973 13
|
存储 SQL 缓存
优化ClickHouse查询性能:最佳实践与调优技巧
【10月更文挑战第26天】在大数据分析领域,ClickHouse 以其卓越的查询性能和高效的列式存储机制受到了广泛的关注。作为一名已经有一定 ClickHouse 使用经验的开发者,我深知在实际应用中,合理的表设计、索引优化以及查询优化对于提升 ClickHouse 性能的重要性。本文将结合我的实践经验,分享一些有效的优化策略。
2111 3
|
Cloud Native Java Nacos
Consul 留给你的时间不多了
Consul 留给你的时间不多了
820 106
|
人工智能 数据可视化 数据挖掘
上海“爷叔”神话分析——爱在深秋
上海“爷叔”股市评论走红,言论影响巨大,分析显示其预测大多不准确,但个别时机准确,模拟操作获利,反映股市预测复杂性,强调投资需谨慎。

热门文章

最新文章