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

news2024/11/27 20:30:28

为什么要用项目配置文件

对于很多程序中要用的参数如果是可变的,那么最好的处理方式就是通过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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring之强大的DefaultListableBeanFactory

系列文章目录 如何查看类继承结构参考这里 文章目录 系列文章目录一、DefaultListableBeanFactory的类继承实现结构二、实现接口 一、DefaultListableBeanFactory的类继承实现结构 二、实现接口 AliasRegistry&#xff1a;支持别名功能&#xff0c;一个名字可以对应多个别名B…

Leetcode2962. 统计最大元素出现至少 K 次的子数组

Every day a Leetcode 题目来源&#xff1a;2962. 统计最大元素出现至少 K 次的子数组 解法1&#xff1a;滑动窗口 算法如下&#xff1a; 设 mx max⁡(nums)。右端点 right 从左到右遍历 nums。遍历到元素 xnums[right] 时&#xff0c;如果 xmx&#xff0c;就把计数器 co…

qt源码阅读准备

qt源码阅读准备 阅读qt源码前先了解以下知识&#xff0c;对阅读qt源码有极大的好处。 D-pointer介绍 D-pointer介绍 d-pointer它可以把一个类库的实施细节对使用的用户隐藏&#xff0c; 而且对实施的更改不会打破二进制兼容。其基本贯穿qt所有类。 Qt类的的结构 我们以QO…

【unity】基于Obi的绳/杆蓝图、绳杆区别及其创建方法

绳索 是通过使用距离和弯曲约束将粒子连接起来而形成的。由于规则粒子没有方向(只有位置)&#xff0c;因此无法模拟扭转效应(维基百科)&#xff0c;绳子也无法保持其静止形状。然而&#xff0c;与杆不同的是&#xff0c;绳索可以被撕裂/劈开&#xff0c;并且可以在运行时改变其…

第3章 【例题】(完整版)

目录 前言 【例3.1】有关成绩结构体的例子 【例3.2】使用Score类的完整程序 【例 3.3】一个存在错误的程序 【例3.4】用对象赋值语句的例子 【例3.5】为类Score定义一个构造函数 【例3.6】建立对象的同时&#xff0c;用构造函数给数据成员赋初值 【例3.7】用成员初始…

智能手机2024:狂卷“微创新”后如何突破新机遇

文 | 智能相对论 作者 | 楷楷 2023年&#xff0c;智能手机市场终于开始展露曙光。Counterpoint Research数据显示&#xff0c;2023年10月全球智能手机销量同比增长5%&#xff0c;智能手机市场出货量在经历了连续27个月的同比下滑后&#xff0c;首次出现同比正增长。 特别是在…

IDEA卡在”正在解析Maven依赖项“的解决方法

修改Maven镜像&#xff0c;修改Maven镜像为阿里云镜像 1.文件路径 C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\plugins 2.因为我使用的是InteliJ idea 自带的Maven&#xff0c;所以直接去idea 插件安装目录&#xff0c;找到Maven插件&#xff0c;找到setting.xml 文…

Linux第4步_安装VMwareTools

安装Ubuntu操作系统后&#xff0c;就可以安装VMwareTools了&#xff0c;目的是实现“电脑和虚拟机之间互相复制粘贴文件”。 1、双击桌面图标“VMware Workstation Pro”&#xff0c;然后点击下图中的“开机”&#xff0c;打开虚拟机电源。 2、双击下图中的用户名“zgq” 3、…

Ubuntu上使用node搭建本地静态http服务器

1.搭建步骤 1.安装Node.js。首先确保你的Ubuntu系统已经安装了Node.js。如果没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; sudo apt-get update sudo apt-get install nodejs #安装nodejs 2.安装npm。npm是Node.js的包管理器&#xff0c;一般会随着Node.js一…

面试算法90:环形房屋偷盗

题目 一条环形街道上有若干房屋。输入一个数组表示该条街道上的房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取的财产的数量。例如&#xff0c;街道上5家的财产用数组[2&#xff0c;3&#xff0c;4&#xff0c;5…

【Filament】加载obj和fbx模型

1 前言 3D 模型的常用格式主要有 obj、fbx、gltf 等&#xff0c;Filament 中的 filamesh.exe 工具可以将 obj、fbx 格式转换为 filamesh 格式&#xff0c;然后再加载显示。对于 gltf 格式模型&#xff0c;可以通过 ModelViewer 加载显示&#xff0c;这不在本文的讨论范围内。 1…

【Java基础篇】常见的字符编码、以及它们的区别

常见的字符编码、以及它们的区别 ✔️ 解析✔️扩展知识仓✔️Unicode和UTF-8有啥关系?✔️有了UTF-8&#xff0c;为什么要出现GBK✔️为什么会出现乱码 ✔️ 解析 就像电报只能发出 ”滴” 和 ”答” 声一样&#xff0c;计算机只认识 0 和 1 两种字符&#xff0c;但是&#x…

Python从入门到网络爬虫(函数详解)

前言 函数是变成语言中最常见的语法&#xff0c;函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已&#xff0c;他是一种特定的代码组结构。 函数的作用 1.提升代码的重复利用率&#xff0c;避免重复开发相同代…

ssm基于vue框架和elementui组件的手机官网论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本手机官网就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#x…

【UEFI基础】EDK网络框架(UNDI)

UNDI UNDI代码综述 UNDI全称Universal Network Driver Interface&#xff0c;它虽然属于UEFI网络框架的一部分&#xff0c;但是并没有在EDK开源代码中实现。不过目前主流网卡厂商都会提供UEFI下的网络驱动&#xff0c;并且大部分都实现了UNDI&#xff0c;这样BIOS下就可以通过…

鸿蒙APP上线注意事项

在将鸿蒙APP上线之前&#xff0c;开发者需要注意一些关键的事项&#xff0c;以确保应用的顺利发布和良好运营。以下是一些建议的注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.遵循应用市…

【常用排序算法】冒泡排序

冒泡排序 冒泡排序基本思想&#xff1a;N 个数的数组&#xff0c;经过N-1轮排序。 升序 大的值下沉&#xff0c;小的值上浮。降序 小的值下沉&#xff0c;小的字上浮 import java.util.Arrays; public class BubbleSort {public static void main(String[] args) {int[] values…

电脑视频需要分屏怎么做

在当今数字时代&#xff0c;人们对于视频的需求越来越高。有时候&#xff0c;我们可能想在同一屏幕上同时播放多个视频&#xff0c;进行对比、观看、剪辑或者其他目的。那么&#xff0c;视频分屏应该怎么做呢&#xff1f; 在本篇文章中&#xff0c;我们将会详细的为你介绍视频分…

Geotrust DV通配符证书保护域名数量

Geotrust是一家知名的SSL证书提供商&#xff0c;旗下有多种类型的SSL数字证书&#xff0c;保护网站数据在传输过程中的安全性和完整性&#xff0c;帮助用户确认其网站的安全。通配符SSL证书是Geotrust颁发的一种可以同时保护多个域名站点的SSL证书。今天就随SSL盾小编了解Geotr…

conda虚拟环境搭建和打包,删除,移动等全流程及相关问题汇总

私人笔记无偿分享&#xff0c;更多内容请访问&#xff1a;链接&#xff1a;https://pan.baidu.com/s/19mS5N9XJ_AotF20kUwSA3w?pwdp5kx 提取码&#xff1a;p5kx 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 4.4. anaconda虚拟环境搭建&#xff1a; 网址&am…