基于C/C++的非系统库自定义读写ini配置

INI文件由节、键、值组成。

[section]

参数

(键=值)

name=value

这里将常用的操作方式封装成了一个dll供外部使用

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LIBCFG_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// LIBCFG_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef LIBCFG_EXPORTS
#define LIBCFG_API __declspec(dllexport)
#else
#define LIBCFG_API __declspec(dllimport)
#endif
LIBCFG_API int cfg_init(const char* cfg_name);
LIBCFG_API void cfg_free();
LIBCFG_API char* cfg_get(const char* section, const char* name);
LIBCFG_API int cfg_set(const char* section, const char* name, const char* value);
LIBCFG_API int cfg_save(const char* cfg_name);
LIBCFG_API void cfg_print();
LIBCFG_API int cfg_log(char* logfile, unsigned char logLevel);
LIBCFG_API int cfg_delete(const char* section, const char* name);

定义相关操作接口的函数指针

typedef  int(*Cfg_init)(const char* cfg_name);
typedef  void(*Cfg_free)();
typedef char*(*Cfg_get)(const char* section, const char* name);
typedef  int(*Cfg_set)(const char* section, const char* name, const char* value);
typedef  int(*Cfg_save)(const char* cfg_name);
typedef  void(*Cfg_print)();
typedef  int(*Cfg_log)(char* logfile, unsigned char logLevel);
typedef  int(*Cfg_delete)(const char* section, const char* name);

定义API函数变量

int cfg_load = UNZ_ERRNO;HMODULE cfgDll;
static Cfg_init	_cfg_init;
static Cfg_free	_cfg_free;
static Cfg_get	_cfg_get;
static Cfg_set	_cfg_set;
static Cfg_save	_cfg_save;
static Cfg_print _cfg_print;
static Cfg_log	 _cfg_log;
static Cfg_delete _cfg_delete;

接口导出:

int load_cfg() {char path[] = "D:\\D-Pro\\Summary\\libcfg\\Release\\libcfg.dll";if (cfg_load == UNZ_OK)return UNZ_OK;cfgDll = LoadLibrary(path);if (cfgDll != NULL) {_cfg_init = (Cfg_init)GetProcAddress(cfgDll, "cfg_init");_cfg_free = (Cfg_free)GetProcAddress(cfgDll, "cfg_free");_cfg_get = (Cfg_get)GetProcAddress(cfgDll, "cfg_get");_cfg_set = (Cfg_set)GetProcAddress(cfgDll, "cfg_set");_cfg_save = (Cfg_save)GetProcAddress(cfgDll, "cfg_save");_cfg_print = (Cfg_print)GetProcAddress(cfgDll, "cfg_print");_cfg_log = (Cfg_log)GetProcAddress(cfgDll, "cfg_log");_cfg_delete = (Cfg_delete)GetProcAddress(cfgDll, "cfg_delete");cfg_load = UNZ_OK;return UNZ_OK;}return UNZ_ERRNO;
}

接口调用:

int cfg_init(const char *cfgfile) {load_cfg();if (cfg_load == UNZ_ERRNO)return UNZ_ERRNO;_cfg_init(cfgfile);
}void cfg_free() {load_cfg();if (cfg_load == UNZ_ERRNO)return;_cfg_free();
}
char* cfg_get(const char* section, const char* name) {load_cfg();if (cfg_load == UNZ_ERRNO)return NULL;return _cfg_get(section,name);
}
int cfg_set(const char* section, const char* name, const char* value) {load_cfg();if (cfg_load == UNZ_ERRNO)return UNZ_ERRNO;return _cfg_set(section, name, value);
}
int cfg_delete(const char* section, const char* name) {load_cfg();if (cfg_load == UNZ_ERRNO)return UNZ_ERRNO;return _cfg_delete(section, name);
}
int cfg_save(const char* cfg_name) {load_cfg();if (cfg_load == UNZ_ERRNO)return UNZ_ERRNO;return _cfg_save(cfg_name);
}
void cfg_print() {load_cfg();if (cfg_load == UNZ_ERRNO)return ;_cfg_print();
}
int cfg_log(char* logfile, unsigned char logLevel) {load_cfg();if (cfg_load == UNZ_ERRNO)return UNZ_ERRNO;return _cfg_log(logfile, logLevel);
}

应用示例:

创建一个config.ini文件

int main() {cfg_set("config","第一个节点","节点1的值");cfg_save("config.ini");cfg_free();return 0;
}

读取config.in文件指定节点值

#include "libcfg.h"
int main() {char* value = NULL;cfg_init("config.ini");value = cfg_get("config","第一个节点");printf("\nvalue:%s\n", value);cfg_free();return 0;
}

修改节点的值并保存

#include "libcfg.h"
int main() {char* value = NULL;cfg_init("config.ini");value = cfg_get("config","第一个节点");printf("\nvalue:%s\n", value);cfg_set("config", "第一个节点","修改值测试");value = cfg_get("config", "第一个节点");printf("\nvalue:%s\n", value);cfg_save("config.ini");cfg_free();return 0;
}

 

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

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

相关文章

有什么简单实用的民宿管理系统软件?民宿如何开拓盈利渠道?

民宿是近些年兴起的一种小型住宿设施,一般就是利用当地的一些民房改造的。民宿的装修风格一般更加具有本土风味,很适合拍照打卡。不过民宿由于规模比较小,所以员工一般也不多,很多民宿的入住登记都要旅客自己弄。所以有很多民宿会…

Apache DolphinScheduler 社区荣获 “2023 年度优秀开源技术团队“ 奖项

在开源社区日益繁荣的今天,我们非常荣幸地宣布:Apache DolphinScheduler 社区在 OSCHINA 平台的评选中荣获了“2023 年度优秀开源技术团队”奖项。这一奖项反映了我们社区在过去一年里在内容发表的深度与广度、活动运营影响力以及对开源文化的推广方面所…

AGILE-SCRUM

一个复杂的汽车ECU开发。当时开发队伍遍布全球7个国家,10多个地区,需要同时为多款车型定制不同的软件,头疼的地方是: 涉及到多方人员协调,多模块集成和管理不同软件团队使用的设计工具、验证工具,数据、工…

如何在本地搭建Oracle数据库并实现无公网ip通过PLSQL工具远程连接数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 正文开始前给大家推荐个网站,前些天发…

基于JAVA的校园电子商城系统论文

摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此校园购物信息的…

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结…

大数据云计算——Docker环境下部署Hadoop集群及运行集群案列

大数据云计算——Docker环境下部署Hadoop集群及运行集群案列 本文着重介绍了在Docker环境下部署Hadoop集群以及实际案例中的集群运行。首先,文章详细解释了Hadoop的基本概念和其在大数据处理中的重要性,以及为何选择在Docker环境下部署Hadoop集群。接着&…

12.HTML5新特性

HTML5新特性 1.介绍 它是万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改。用于取代 HTML4 与 XHTML 的新一代标准版本,所以叫HTML5 HTML5 在狭义上是指新一代的 HTML 标准,在广义上是指…

云原生之深入解析K8s中的微服务项目设计与实现

一、微服务项目的设计 ① 微服务设计的思想 一个单片应用程序将被构建、测试并顺利地通过这些环境。事实证明,一旦投资于将生产路径自动化,那么部署更多的应用程序似乎就不再那么可怕了。请记住,CD的目标之一就是让部署变得无聊&#xff0c…

提升团队效率,防止员工飞单私单的秘诀!

在如今竞争激烈的商业环境中,每个企业都追求更高的销售业绩和客户满意度。然而,有些员工可能会利用V信等社交工具进行私下交易,导致公司的利益损失和客户信任的瓦解。所以,如何防止员工飞单私单成为了一个需要解决的问题。 在这里…

FL Studio20官方版怎么下载安装?2024最新版图文详细教程

水果音乐制作软件FL Studio2024是一款功能强大的软件音乐制作环境或数字音频工作站(DAW),本文主要针对FL Studio 2024怎么安装?来为大家带来了水果软件FL Studio 2024安装图文详细教程!水果音乐制作软件FL Studio2024版…

智能分析/可视化安防监控系统EasyCVR风光互补远程视频监控方案

一、背景需求 在一些偏远地区,也具有视频监控的需求。但是这类场景中,一般无法就近获取市电,如果要长距离拉取市电,建设的成本非常高且长距离传输有安全隐患,因此风光互补远程视频监控方案的需求也较多。利用风光电转…

TCP/IP 四层体系结构

目录 ​编辑 导言: 应用层 1. HTTP(超文本传输协议) 2. FTP(文件传输协议) 3. SMTP(简单邮件传输协议) 4. POP3(邮局协议第3版) 5. IMAP(互联网消息访…

Python安装报错: This environment is externally managed

error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.这个错误信息表示当前Python环境是由系统外部管理的&…

System 2 Attention:可以提高不同LLM问题的推理能力

推理正在成为大型语言模型(llm)关注的下一个主要领域。尽管llm拥有先进的能力,但大多数llm经常被简单的错误绊倒,显示出他们在推理方面的局限性。这些模型可能会被上下文中的不相关细节所误导,或者受到输入提示中的偏差的影响。而后一种倾向被…

【Apollo】编译 Apollo 源码

https://github.com/ApolloAuto/apollo/blob/master/docs/01_Installation%20Instructions/apollo_build_and_test_explained.md 查看apollo.sh 的用法 ./apollo.sh --help可以编译整个模块,也可以单独编译某一个子模块./modules 为简单起见,Apollo 6.0…

JAVA:注册表窗口的实现

目录 题目要求: 思路大意: 窗体的实现: 窗口A: 窗口B: 窗体之间的构思: 关键代码的实现: 窗口A: 封装列表: 窗口B: 题目要求: 使用…

网站使用CDN后无法获取用户真实IP的解决方法

宝塔或Nginx环境 如果你使用的宝塔或Nginx,可以在宝塔面板或Nginx中,找到配置文件增加如下代码后,重载配置或者重启 Nginx 即可: #CDN获取真实ip set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; PHP语言函数方法…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著,设计用于信道估计时,需要考虑解调参考信号,5G用DMRS结构而不是CRS结构,因此需要为高速UE设计DMRS结构,DMRS设计是为了提高信道估计并减…

【AI底层逻辑】——数学与机器学习:优雅的智慧之舞

目录 “宝藏网站” 聊聊数学 “华尔兹” “智慧之舞” 后续的章节我们将迎来新的篇章,新的切入点探索AI的奥秘,通过揭示高数、矩阵、概率论等数学知识与机器学习的关系来深入理解AI的奥秘! “宝藏网站” 开头先给大家上几个宝藏网站&am…