linux 使用iniparser读取.ini文件的配置信息

为什么要用项目配置文件

对于很多程序中要用的参数如果是可变的,那么最好的处理方式就是通过main(int argc,char **argv) 函数参数传递,或者从别的地方去获取,这其中之一就是配置文件,但是在一个成熟和架构完善的系统,一般都会做到自动配置,自动部署,所以有的系统里会有一个单独的配置服务存在,每个其它的服务的配置信息从配置中心服务
获取,然后运维人员通过操作界面把配置信息下发给配置中心服务.几乎每一个大型互联网项目都会涉及到项目配置

1安装第三方开源的iniparser

git clone https://github.com/ndevilla/iniparsercd iniparsermake

在这里插入图片描述
在这里插入图片描述

使用iniparser编译选项
-liniparser

2 设置配置 .ini 信息

server.ini

[tabase]
ip = 127.0.0.1;
port = 3306;
user = root;
pwd = 12345678;
db = ReadIni;[server]
port = 8888;

3 创建配置文件结构体

configdef.h

#ifndef SHBK_COMMON_INICONFIG_H
#define SHBK_COMMON_INICONFIG_H#include <string>typedef struct st_env_config {//数据库配置std::string db_ip;      //数据库ipunsigned 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 short 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 // !SHBK_COMMON_IN

4 将 获取配置信息 & 初始化配置信息 封装成类

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_

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;if (!_isloaded){ini = iniparser_load(path.c_str());if (ini == NULL) {fprintf(stderr, "cannot parse file: %s\n", path.c_str());return -1;}const char* ip   = iniparser_getstring(ini, "tabase:ip",   "127.0.0.1");int         port = iniparser_getint   (ini, "tabase:port", 3306 );const char* user = iniparser_getstring(ini, "tabase:user", "root");const char* pwd  = iniparser_getstring(ini, "tabase:pwd",  "12345678");const char* db   = iniparser_getstring(ini, "tabase:db",   "ReadIni");int         sport= iniparser_getint   (ini, "server:port", 8888);_config = _st_env_config(std::string(ip), port, std::string(user),std::string(pwd), std::string(db),sport);iniparser_freedict(ini);_isloaded = true;	return true;}
}const _st_env_config& Iniconfig::getconfig()
{return _config;
}

5读取配置信息

main.cpp

#include <stdio.h>
#include "iniconfig.h"
#include "configdef.h"int main(int argc, char* argv[]) {if (argc != 2)//传入参数不合法{printf("Please input format <your process> <.ini 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("[tabase] ip:%s port:%d user:%s pwd:%s db:%s [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;
}

6使用CMake编译此项目

在main.cpp 所在文件创建/third/include 和 /third/lib目录存放头文件和库
将头文件和库分别复制创建的目录中

CMakeLists.txt

#指定版本号
CMAKE_MINIMUM_REQUIRED(VERSION  3.5)
#工程名
PROJECT(ini_demo)
#将指定的目录头文件添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(./third/include)#将指定的目录库文件添加需要链接的库文件目录之下
LINK_DIRECTORIES(./third/lib/iniparser)#内置变量:CMAKE_SOURCE_DIR 定义了顶级CMakeLists.txt 所在文件夹
#PROJECT_SOURCE_DIR定义了包含project()命令的CmakeLists.txt所在的文件夹
#搜集所有在指定路径下的源文件名,将输出结果储存在指定的变量中
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)#使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(ini_demo  ${SOURCE_FILES})#用来显示的定义变量
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -g3 -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations -fpermissive ")#该指令的作用为目标文件与库文件进行链接
TARGET_LINK_LIBRARIES(ini_demo  iniparser)
target_link_libraries(ini_demo  pthread)#设置默认安装目录
SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})#安装
INSTALL(TARGETS ini_demo DESTINATION bin)

cmake .
make

在这里插入图片描述
执行程序
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/321935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟器怎么代理IP?代理IP对手机设置模拟器有哪些影响?

一、代理IP的基本概念和作用流冠代理IP是一种网络服务&#xff0c;可以帮助用户隐藏自己的真实IP地址&#xff0c;通过代理服务器进行网络请求&#xff0c;从而保护用户的隐私和安全。在模拟器中&#xff0c;代理IP的作用也是如此&#xff0c;可以帮助模拟器隐藏真实的IP地址&a…

CISSP 第9章:安全脆弱性、威胁和对策

第九章 安全脆弱性、威胁和对策 9.1 评估和缓解安全脆弱性 9.1 硬件 处理器 执行类型 多任务处理&#xff1a; 同时处理两个或更多任务 多处理&#xff1a; 利用多个处理器完成一个应用程序的处理能力 多程序设计&#xff1a;通过操作系统对单个处理器上的两个任务进行协调&…

福建科立讯通信 指挥调度管理平台 多处文件上传漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任…

android anr 总结

主要还是从 不同的状态来进行分类处理&#xff1a; 在排除了 lowmemory&#xff08;看cpu占用及有误低内存tag值打印&#xff09; 和iowait&#xff08;看占比&#xff09;的影响外 主要就是看线程的状态了 最主要的就是block 和wait状态 block的看下held by 哪位线程即可 …

Flume基础知识(五):Flume实战之实时监控目录下多个新文件

1&#xff09;案例需求&#xff1a; 使用 Flume 监听整个目录的文件&#xff0c;并上传至 HDFS 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;创建配置文件 flume-dir-hdfs.conf 创建一个文件 vim flume-dir-hdfs.conf …

python opencv怎么安装

1、安装python 注意&#xff1a;windows10 安装时强烈建议不用使用 Windows Store 安装。避免后期python运行时牵扯权限相关问题。 具体步骤&#xff1a; 1、前往python官网下载windows python 安装包 2、双击运行安装&#xff08;强力建议自定义安装&#xff0c;勾选pip&#…

篇二:springboot2.7 OAuth2 server使用jdbc存储RegisteredClient

上一篇 <<springboot 2.7 oauth server配置源码走读一>>中简单描述了oauth2 server的配置&#xff0c;其中使用了内存保存 RegisteredClient&#xff0c;本篇改用mysql存储。 db存储需要创建表&#xff0c;表结构应该是什么样的呢&#xff0c;从spring给我们封装好…

【前沿技术杂谈:ChatGPT】ChatGPT——热潮背后的反思

【前沿技术杂谈&#xff1a;ChatGPT】ChatGPT——热潮背后的反思 缘起&#xff1a;无中生有&#xff0c;涅槃重生人工智能技术人工智能的发展史无中生有内容自动生成技术的发展代表企业OpenAI-GPT系列技术的发展历程ChatGPT新特点 热潮&#xff1a;万众瞩目&#xff0c;群雄逐鹿…

数据挖掘总结(考试版)

数据挖掘总结&#xff1a; 第一章&#xff1a; 数据挖掘KDD步骤&#xff1a; 数据清理: (消除噪声和删除不一致的数据)数据集成&#xff08;多种数据源可以组合在一起&#xff09;数据选择&#xff08;从数据库中提取与分析任务相关的数据&#xff09;数据变换&#xff08;数…

【React系列】Hook(二)高级使用

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. Hook高级使用 1.1. useReducer 很多人看到useReducer的第一反应应该是redux的某个替代品&#xff0c;其实并不是…

JVS规则引擎和智能BI(自助式数据分析)1.3新增功能说明

规则引擎更新功能 新增: 1、数据源新增Excel数据源&#xff1b; Excel数据源功能允许用户将Excel文件作为数据源导入&#xff0c;并进行数据清洗、转换和处理&#xff0c;以实现数据的集成、可视化和深度分析&#xff0c;为决策提供强大支持&#xff0c;同时保持良好的交互性…

二、串行FLASH文件系统FatFs移植

经过上一节的分析&#xff0c;我们对文件系统有一定的理解了&#xff0c;这一节给大家介绍怎么把FatFs文件系统的这些代码移植到STM32S上&#xff0c;然后STM32利用这一些代码或者函数&#xff0c;以文件的格式对FLASH进行读写数据。 实则对diskio.c提供一些函数接口。 首先将…