iniparser开源库详解

目录

一、iniparser的概述

二、为什么要用iniparser

三、下载库

四、常用API介绍

1、加载ini文件

2、获取键值

3、设置键值

4、移除键值

5、 判断键是否存在

6、获取section个数

7、获取section下key个数

8、保存dictionary对象到文件中

9、释放dictionary对象

五、实例Demo


一、iniparser的概述

INI(Initialization File)文件是一种简单直观的数据存储格式,常用于配置应用程序的初始化设置。这种文件通常包含若干个节(section)和键值对(key-value pairs)。INI文件的每一部分都是自描述性的,易于阅读和编辑,使得非程序员也能轻易理解并修改配置参数。
INI文件因其简单易用性而在许多编程语言中广泛应用,尤其是在Windows操作系统中,很多应用程序都采用INI文件作为配置文件。当然,随着XML、JSON等更丰富、更结构化的数据交换格式的普及,INI文件在现代应用程序中的使用相对减少,但在一些轻量级应用或对启动速度有较高要求的情况下,仍然是一种常见且实用的配置文件格式。

二、为什么要用iniparser

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

几乎每一个大型互联网项目都会涉及到项目配置,如mysql 的配置文件:

三、下载库

库链接:

https://github.com/ndevilla/iniparsericon-default.png?t=N7T8https://github.com/ndevilla/iniparser

编译:

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

测试:

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

四、常用API介绍

1、加载ini文件

  /*
   *  @brief  从ini格式的配置文件中加载数据
   *  @param  [IN]  ininame  要打开的ini格式文件            
   *  @return != NULL 返回一个指向dictionary结构的指针
   *          == NULL 加载ini文件失败
  */
  dictionary * iniparser_load(const char *ininame);

2、获取键值

  /*
   *  @brief  获取指定键(key)对应的字符串类型的值
   *  @param  [IN]  d  dictionary结构的指针   
   *  @param  [IN]  key  要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
   *  @param  [IN]  def  当键不存在或者其值不是字符串时的默认返回值。如果没有找到对应键,函数将返回此默认值。    
   *  @return 如果找到了相应的键,返回键值对应字符串
   * 			如果没有找到匹配的键,返回def指定的字符串值
  */
  const char * iniparser_getstring(const dictionary *d, const char *key, const char *def);

  /*
  *  @brief  获取指定键(key)对应的整数值
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  key  要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
  *  @param  [IN]  notfound  当键不存在或者其值不能被转换为整数时,函数将返回这个默认值。   
  *  @return 如果找到了相应的键,并且其值可以被成功转换为整数,则返回该整数值。
  *		   如果没有找到匹配的键,或者该键对应的值无法转换为整数,则返回 notfound 参数提供的默认值。
  */
  int iniparser_getint(const dictionary * d, const char * key, int notfound);

  /*
  *  @brief  获取指定键(key)对应的浮点型值
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  key  要查找的键,通常格式为 "section:key",表示要获取哪个节(section)下的哪一项(key)的值。
  *  @param  [IN]  notfound  当键不存在或者其值无法转换为双精度浮点数时,函数返回的默认值。
  *  @return 如果找到了相应的键,并且其值能成功转换为一个双精度浮点数,则返回该浮点数。
  *		   如果没有找到匹配的键,或者键的值不能被解释为一个有效的双精度浮点数,则返回 notfound 参数所提供的默认值。
  */
  double iniparser_getdouble(const dictionary *d, const char *key, double notfound);

3、设置键值

  /*
  *  @brief  设置或修改 ini  配置文件中某个键值对
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  entry  字符串形式的键值对标识符,格式通常是 "section:key",表明您要在哪个节(section)下的哪个键(key)上设置或修改值(val)。
  *						key值存在则修改对应val,key值不存在则会新增
  *  @param  [IN]  val: 要设置的新值,作为字符串传递。
  *  @return 返回0表示设置成功
  */
  int iniparser_set(dictionary *ini, const char *entry, const char *val);

4、移除键值

  /*
  *  @brief  移除 ini 配置文件中某个键值对
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  entry  字符串形式的键名,包括可选的部分名称(section)和键(key)
  *					     如果不指定key,则会移除整个section
  */
  void iniparser_unset(ini, const char *entry);

5、 判断键是否存在

  /*
  *  @brief  判断 ini 配置文件是否存在某个键值
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  entry  字符串形式的键值对标识符,格式通常是 "section:key"
  *  @return 返回1表示存在,返回0表示不存在
  */
  int iniparser_find_entry(const dictionary *ini, const char *entry);

6、获取section个数

  /*
  *  @brief  获取ini配置文件中section的数量
  *  @param  [IN]  d  dictionary结构的指针             
  *  @return 成功返回section个数,失败返回 -1
  */
  int iniparser_getnsec(const dictionary * d);

  /*
  *  @brief  获取某个section值
  *  @param  [IN]  d  dictionary结构的指针
  *  @param  [IN]  n  指定获取第几个section值                  
  *  @return 成功返回获取到的section值,失败返回NULL
  */
  const char *iniparser_getsecname(const dictionary * d, int n);

7、获取section下key个数

  /*
  *  @brief  获取ini配置文件中某个section的key个数
  *  @param  [IN]  d  dictionary结构的指针 
  *  @param  [IN]  s  section          
  *  @return 返回指定section下的key个数
  */
  int iniparser_getsecnkeys(dictionary * d, char * s); 

  /*
  *  @brief  获取ini配置文件中某个section的所有key
  *  @param  [IN]  d  dictionary结构的指针 
  *  @param  [IN]  s  section      
  *  @param  [OUT]  keys  通过这个参数输出key,也可以通过返回值获取     
  *  @return  成功返回指定section下的key,失败返回NULL
  */
  const char **iniparser_getseckeys(const dictionary *d, const char *s, const char **keys)

8、保存dictionary对象到文件中

  /*
  *  @brief  保存dictionary对象到文件中
  *  @param  [IN]  d  dictionary结构的指针   
  *  @param  [IN]  f  已打开的文件描述符
  */
  void iniparser_dump_ini(const dictionary *d, FILE *f);

9、释放dictionary对象

  /*
  *  @brief  释放dictionary对象
  *  @param  [IN]  d  dictionary结构的指针   
  */
  void iniparser_freedict(dictionary * d);

五、实例Demo

typedef struct st_env_config
{
   //数据库的配置
   std::string db_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 int 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;

bool Iniconfig::loadfile(const std::string& path)
{
    dictionary*   ini = NULL;

    ini = iniparser_load(path.c_str());
    if (ini==NULL)
    {
        LOG_ERROR("cannot parse file: %s\n", path.c_str());
        return false;
    }

    char* ip    = iniparser_getstring(ini, "database:ip", "127.0.0.1");
    int   port  = iniparser_getint(ini, "database:port", 3306);
    char* user  = iniparser_getstring(ini, "database:user", "root");
    char* pwd   = iniparser_getstring(ini, "database:pwd", "123456");
    char* db    = iniparser_getstring(ini, "database:db", "userdb");
    int   sport = iniparser_getint(ini, "server:port", 9090);

    _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;
}
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的鱼-blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值