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

为什么要用项目配置文件

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

1安装第三方开源的iniparser

git clone https://github.com/ndevilla/iniparser

cd iniparser

make

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

使用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;      //数据库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 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring的依赖注入(DI)

1.DI 概述&#xff1a;DI&#xff08;Dependency Injection&#xff09;依赖注入&#xff0c;在Spring创建对象的同时&#xff0c;为其属性赋值&#xff0c;称之为依赖注入。 1.1构造函数注入 顾名思义&#xff0c;就是使用类中的构造函数&#xff0c;给成员变量赋值。注意&…

ts相关笔记(基础必看)

推荐一下小册 TypeScript 全面进阶指南&#xff0c;此篇笔记来源于此&#xff0c;记录总结&#xff0c;加深印象&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&#xff0c;可以参考我的其他笔记&#xff1a; vue3ts开发干货笔记TSConfig 配置&#xff08;tsconfig.…

安全cdn有哪些优势

1. 免备案&#xff1a;在中国大陆地区&#xff0c;进行网站建设需要先进行备案手续&#xff0c;而安全cdn可以避免这一繁琐的步骤&#xff0c;节省时间和精力。 2. 精品线路&#xff1a;安全cdn使用的是覆盖范围更广、速度更快的香港CN2 GIA优化线路。 3. 高速稳定&#xff1a…

Java多线程技术10——线程池ThreadPoolExecutor之Executor接口

1 概述 在开发服务器软件项目时&#xff0c;经常需要处理执行时间很短并且数据巨大的请求&#xff0c;如果为每一个请求创建一个新的线程&#xff0c;则会导致性能上的瓶颈。因为JVM需要频繁地处理线程对象的创建和销毁&#xff0c;如果请求的执行时间很短&#xff0c;则有可能…

【量化金融】《证券投资学》吴晓求(第四版)(更新中)

这里写目录标题 第一篇 基本知识第1章 证券投资工具名词解释简答题 第2章 证券市场名词解释简答题 第二篇 基本分析第三篇 技术分析第四篇 组合管理第五篇 量化分析与交易策略 第一篇 基本知识 第1章 证券投资工具 名词解释 风险&#xff08;risk&#xff09; 未来结果的不…

Hive - Select 使用 in 限制范围

目录 一.引言 二.Select Uid Info 1.少量 Uid 2.大量 Uid ◆ 建表 ◆ 本地 Load ◆ HDFS Load ◆ Select In 三.总结 一.引言 工业场景下 Hive 表通常使用 uid 作为用户维度构建和更新 Hive 表&#xff0c;当我们需要查询指定批次用户信息时&#xff0c;可以使用 in …

Spark内核解析-Spark shuffle6(六)

1、Spark Shuffle过程 1.1MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌、混洗&#xff0c;把一组有一定规则的数据尽量转换成一组无规则的数据&#xff0c;越随机越好。MapReduce中的Shuffle更像是洗牌的逆过程&#xff0c;把一组无规则的数据尽量转换成一组具有一定规则…

极速 JavaScript 打包器:esbuild

文章目录 引言什么是esbuild&#xff1f;esbuild的特点esbuild如何实现如此出色的性能&#xff1f;esbuild缺点基本配置入口文件输出文件模块格式targetplatformexternalbanner和footer 高级配置插件系统自定义插件压缩代码调试代码 结论&#x1f636; 写在结尾 引言 esbuild是…

月薪15000在春晚分会场西安,够花吗?

千寻的结论&#xff1a; 如果有房无贷&#xff0c;另一半也有工作收入&#xff0c;父母身体健康且均有不错的退休金&#xff0c; 满足这些条件的话&#xff0c;在西安月入1.5W是相当不错。

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…

Flutter 图片和资源的高效使用指南

Flutter 应用程序包含代码和 assets&#xff08;也为资源&#xff09;。资源是被打包到应用程序安装包中&#xff0c;可以在运行时访问的一种文件。常见的资源类型包括静态数据&#xff08;例如 JSON 文件&#xff09;&#xff0c;配置文件&#xff0c;图标和图片&#xff08;J…

14:00面试,14:08就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到10月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

springboot第47集:【思维导图】面向对象,关键字,标识符,变量,数组的使用...

关键字&#xff1a;class,public,static,void等&#xff0c;特点是全部关键字都是小写字母。 image.png image.png 凡是自己起的名字可以叫标识符 image.png image.png image.png image.png 整数类型的使用 image.png image.png image.png 浮点类型 image.png image.png 字符类…

回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测

回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测 目录 回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输…

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习&#xff0c;并且关闭弹幕。 数组的定义&#xff1a;数组是一个容器&#xff0c;用来存储一批同种类型的数据。 下述图&#xff1a;是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢&#xff1f;为了解决在某些场景下&#xff0c;变…

安装extiverse/mercury时报错

问题描述 作者在安装 Flarum 的插件 extiverse/mercury 时报错&#xff0c;内容如下图所示 解决方案 ⚠警告&#xff1a;请备份所有数据再进行接下来的操作&#xff0c;此操作可能会导致网站不可用&#xff01; 报错原因&#xff1a;主要问题是在安装过程中解决依赖关系。具…

Day24 回溯算法part01 理论基础 77.组合

回溯算法part01 理论基础 77.组合 理论基础(转载自卡码网) 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 在二叉树系列中&#xff0c;我们已经不止一次&#xff0c;提到了回溯&#xff0c;例如二叉树&#xff1a;以为使用了递归&#xff0c;其…

nVisual如何实现数据中心资产管理

背景 随着信息技术的迅速发展&#xff0c;数据中心已经成为了企业信息化建设的重要基础设施之一。数据中心不仅承载着大量的企业数据和业务应用&#xff0c;而且也需要大量的资产投入来支持其运营和发展。 因此&#xff0c;数据中心资产管理的重要性也日益凸显&#xff0c;数…

SparkStreaming基础解析(四)

1、 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如&#xff1a;map、…

OpenCV-15位运算

OpenCV中的逻辑运算就是对应位置的元素进行与、或、非和异或。 Opencv与Python不同的是&#xff1a;OpenCV中0的非反过来是255&#xff0c;255反过来是0。 但是Python中255非为-256。 一、非运算 使用API---cv.bitwise_not(str) 示例代码如下&#xff1a; import cv2 imp…