基于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;
}

 

相关推荐

  1. python-ConfigParser-配置文件

    2023-12-15 03:08:01       34 阅读
  2. 总结:Qtini配置文件(QSettings)

    2023-12-15 03:08:01       9 阅读
  3. [json]定义

    2023-12-15 03:08:01       35 阅读
  4. 源码分享-golangBMP文件

    2023-12-15 03:08:01       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-15 03:08:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-15 03:08:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-15 03:08:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-15 03:08:01       18 阅读

热门阅读

  1. Heap Sort Algorithm

    2023-12-15 03:08:01       31 阅读
  2. SSH连接慢的问题

    2023-12-15 03:08:01       40 阅读
  3. mysql:尽量避免使用select *语句

    2023-12-15 03:08:01       38 阅读
  4. springboot全面加密方案

    2023-12-15 03:08:01       31 阅读