C语言Iniparser库实现ini文件读写

 更新时间:2023年03月20日 14:50:21   作者:浇筑菜鸟  
iniparser是针对INI文件的解析器。ini文件则是一些系统或者软件的配置文件。本文就来介绍一下如何利用Iniparser库实现ini文件读写吧

一、概述

iniparser是针对INI文件的解析器。ini文件则是一些系统或者软件的配置文件。iniparser库的API可以对ini文件(配置文件)进行解析、设置、删除等操作。

常见的 ini 读写开源库有:minIni、inifile、iniparser

二、使用

下载

Github:https://github.com/ndevilla/iniparser

方式一

1.编译

下载后进入文件根目录,使用 make 命令编译,编译完成后会生成 libiniparser.a 和 libiniparser.so.1 文件

2.测试

iniparser 提供了测试程序,进入 example 目录,使用 make命令编译,完成后会生成 iniexample 执行文件

3.测试结果

4.注意事项

使用链接文件时,可以参考 example 目录下的 Makefile 文件

方式二

此方法使用比较简单,直接将 src 目录下的文件拷贝到工程中即可,使用方式和自己编写的 .c 和 .h 文件一样

三、API函数

iniparser.h

/* 获取dictionary对象的section个数 */
int iniparser_getnsec(dictionary *d);
 
/* 获取dictionary对象的第n个section的名字 */
char * iniparser_getsecname(dictionary *d, int  n);
 
/* 保存dictionary对象到file */
void iniparser_dump_ini(dictionary * d, FILE * f);  
 
/* 保存dictionary对象一个section到file */
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f); 
 
/* 打印 ini 文件内容 */
void iniparser_dump(dictionary * d, FILE * f);  
 
/* 获取dictionary对象某个section下的key个数 */
int iniparser_getsecnkeys(dictionary * d, char * s); 
 
/* 获取dictionary对象某个section下所有的key */
char ** iniparser_getseckeys(dictionary * d, char * s); 
 
/* 返回dictionary对象的section:key对应的字串值 */
char * iniparser_getstring(dictionary * d, const char * key, char * def);   
 
/* 返回idictionary对象的section:key对应的整形值 */
int iniparser_getint(dictionary * d, const char * key, int notfound); 
 
/* 返回dictionary对象的section:key对应的双浮点值 */
double iniparser_getdouble(dictionary * d, const char * key, double notfound);  
 
/* 返回dictionary对象的section:key对应的布尔值 */
int iniparser_getboolean(dictionary * d, const char * key, int notfound); 
 
/* 设置dictionary对象的某个section:key的值 */
int iniparser_set(dictionary * ini, const char * entry, const char * val); 
 
/* 删除dictionary对象中某个section:key */
void iniparser_unset(dictionary * ini, const char * entry); 
 
/* 判断dictionary对象中是否存在某个section:key */
int iniparser_find_entry(dictionary * ini, const char * entry) ; 
 
/* 解析dictionary对象并返回(分配内存)dictionary对象 */
dictionary * iniparser_load(const char * ininame); 
 
/* 释放dictionary对象(内存) */
void iniparser_freedict(dictionary * d);

dictionary.h

/* 计算关键词的hash值  
unsigned dictionary_hash(const char * key); 
 
/* 创建dictionary对象 */
dictionary * dictionary_new(int size);  
 
/* 删除dictionary对象 */
void dictionary_del(dictionary * vd); 
 
/* 获取dictionary对象的key值 */
char * dictionary_get(dictionary * d, const char * key, char * def); 
 
/* 设置dictionary对象的key值 */
int dictionary_set(dictionary * vd, const char * key, const char * val); 
 
/* 删除dictionary对象的key值 */
void dictionary_unset(dictionary * d, const char * key); 
 
/* 保存dictionary对象 */
void dictionary_dump(dictionary * d, FILE * out);

四、演示

1.test.ini 文件

#
# 测试文件
#
 
[Node]
Test                           = 1234

2.test.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
#include "iniparser.h"
 
 
#define FILE_INI "test.ini"
 
/**
 * @brief 读取 ini 文件的配置信息
 * 
 * @param read_buf 读取缓冲去
 * @param return 返回操作结果
 */
int get_ini_info(int *read_buf)
{
    dictionary  *ini;
 
    ini = iniparser_load(FILE_INI);
    if (ini==NULL) {
        fprintf(stderr, "cannot parse file: %s\n", FILE_INI);
        return -1;
    }
 
    /* 打印文件内容 */
    // iniparser_dump(ini, stderr);
 
    /* 读取压力等级的判断信息 */
    *read_buf = iniparser_getint(ini, "node:test", -1);
 
    iniparser_freedict(ini);
    return 0;
}
 
/**
 * @brief 写入 ini 文件的配置信息
 * 
 * @param write_buf 写入缓冲区
 * @param return 返回操作结果
 */
int set_ini_info(const char *write_buf)
{
    dictionary  *ini;
    FILE *fp = NULL;
 
    ini = iniparser_load(FILE_INI);
    if (ini==NULL) {
        fprintf(stderr, "cannot parse file: %s\n", FILE_INI);
        return -1;
    }
 
    /* 写入压力等级的判断信息 */
    iniparser_set(ini, "node:test", write_buf);
 
    /* 将信息保存到文件中 */
    fp = fopen(FILE_INI, "w");
    if( fp == NULL ) {
        fprintf(stderr, "stone:fopen error!\n");
        return -1;
    }
    iniparser_dump_ini(ini, fp);
 
    fclose(fp);
    iniparser_freedict(ini);
    return 0;
}
 
int main (int argc, char **argv)
{
    int num = 0;
    set_ini_info("1234");
    get_ini_info(&num);
    printf("date is: %d \n", num);
}

3.文件目录

4.编译

gcc test.c dictionary.c iniparser.c -o test

5.测试效果

到此这篇关于C语言Iniparser库实现ini文件读写的文章就介绍到这了,更多相关C语言 ini文件读写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++中的string常用函数用法总结

    c++中的string常用函数用法总结

    以下是对c++中的string常用函数的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++基于先序、中序遍历结果重建二叉树的方法

    C++基于先序、中序遍历结果重建二叉树的方法

    这篇文章主要介绍了C++基于先序、中序遍历结果重建二叉树的方法,结合实例形式分析了基于C++构建二叉树的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C++实现LeetCode(102.二叉树层序遍历)

    C++实现LeetCode(102.二叉树层序遍历)

    这篇文章主要介绍了C++实现LeetCode(102.二叉树层序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Visual Studio新建类从默认internal改为public

    Visual Studio新建类从默认internal改为public

    本文将介绍如何将Visual Studio中的internal修饰符更改为public,以实现更广泛的访问和重用,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++实现简单贪吃蛇游戏

    C++实现简单贪吃蛇游戏

    这篇文章主要为大家详细介绍了C++实现简单贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C++面向对象编程之析构详解

    C++面向对象编程之析构详解

    这篇文章主要为大家详细介绍了C++面向对象编程之析构,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 手拉手教你如何理解c/c++中的指针

    手拉手教你如何理解c/c++中的指针

    当你对C越来越熟悉时,你会发现把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一,这篇文章主要给大家介绍了关于c/c++中指针的相关资料,需要的朋友可以参考下
    2021-10-10
  • C++中的ilst使用以及模拟实现

    C++中的ilst使用以及模拟实现

    list是一个类模板,加<类型>实例化才是具体的类,可以在任意位置进行插入和删除的序列式容器,本文将通过代码示例给大家介绍一下C++中的ilst使用以及模拟实现,需要的朋友可以参考下
    2023-08-08
  • Qt实现简单动态时钟

    Qt实现简单动态时钟

    这篇文章主要为大家详细介绍了Qt实现简单动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • c语言常见图片格式判断实例

    c语言常见图片格式判断实例

    这篇文章介绍了c语言常见图片格式判断实例,有需要的朋友可以参考一下
    2013-09-09

最新评论