注:本文系湛江市第十七中学星火创客团队及岭南师范学院物联网俱乐部原创部分训练项目,转载请保留声明。
前言
今天是闭关的的第56天,项目已经完成,今天特地抽时间来总结一下这个项目的具体知识点之Iniparser库,主要用于文件解析。
一、Iniparser概念
?iniparser是针对INI文件的解析器。ini文件则是一些系统或者软件的配置文件。iniparser库的API可以对ini文件(配置文件)进行解析、设置、删除等操作。
二、Iniparser格式
;地址池
[ipaddrpool]
start =192.168.1.1
end =192.168.1.100
[filepath]
leasefile =/var/dhcplease/dhcpd.leases
;网络接口
[network]
interface =en1
[opt]
dns1 =8.8.8.8
dns2 =112.112.112.112
t1 =38
t2 =23
ini文件的最基本组成单元就是key或者叫property,每个key都有一个名称(name)和对应的值(value),例如:
start = 192.168.1.1
“start” 就是名称name, “192.168.1.1”是对应的值;
我们还可以将多个key归类为一组,即section, 组名定义要独立一行,并用中括号括起来:
[ipaddrpool]
start = 192.168.1.1
end = 192.168.1.100
其中 [ipaddrpool] 就是组名, 组成员有”start“、”end“;
在section声明下的keys都会和该section关联起来。一个section的作用域会在下一个section声明的地方结束,如果没有sectionde 的声明,那么该section的结束地方就是该文件末尾。section是不可以嵌套的。
定位一个key是用section:key来表示的,所以不同section下的key名称是可以相同的。
iniparser库处理名称的时候,会统一换成小写,所以section和property的名称命名是大小写无关的。
需要注意的是,每个组下的key的唯一的不能重复的,但不同组下可以存在相同key。
注释要以分号开头:
;地址池
三、Iniparser库API函数
3.1 iniparser.h
int iniparser_getnsec(dictionary *d);
char * iniparser_getsecname(dictionary *d, int n);
void iniparser_dump_ini(dictionary * d, FILE * f);
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f);
void iniparser_dump(dictionary * d, FILE * f);
int iniparser_getsecnkeys(dictionary * d, char * s);
char ** iniparser_getseckeys(dictionary * d, char * s);
char * iniparser_getstring(dictionary * d, const char * key, char * def);
int iniparser_getint(dictionary * d, const char * key, int notfound);
double iniparser_getdouble(dictionary * d, const char * key, double notfound);
int iniparser_getboolean(dictionary * d, const char * key, int notfound);
int iniparser_set(dictionary * ini, const char * entry, const char * val);
void iniparser_unset(dictionary * ini, const char * entry);
int iniparser_find_entry(dictionary * ini, const char * entry) ;
dictionary * iniparser_load(const char * ininame);
void iniparser_freedict(dictionary * d);
3.2 dictionary.h
unsigned dictionary_hash(const char * key);
dictionary * dictionary_new(int size);
void dictionary_del(dictionary * vd);
char * dictionary_get(dictionary * d, const char * key, char * def);
int dictionary_set(dictionary * vd, const char * key, const char * val);
void dictionary_unset(dictionary * d, const char * key);
void dictionary_dump(dictionary * d, FILE * out);
四、代码演示
4.1config.ini
[ipaddrpool]
start = 192.168.0.0
end = 192.168.1.225
[filepath]
leasefile = /var/dhcplease/dhcpd.leases
[network]
interface = en1
[opt]
dns1 = 8.8.8.8
dns2 = 8.8.8.8
subnet = 255.255.255.0
router = 192.168.3.1
domain = local
lease = 864
t1 = 432
t2 = 756
4.2 源码
#include <stdio.h>
#include "iniparser.h"
#include "dictionary.h"
#define PATH "../file/config.ini"
int main (int argc, char **argv)
{
FILE *fp = NULL ;
dictionary *ini= NULL;
ini = iniparser_load(PATH);
if( ini ==NULL)
{
printf("inipar failure\n");
return -1;
}
iniparser_set(ini, "ipaddrpool:start", "192.168.0.0");
iniparser_set(ini, "ipaddrpool:end", "192.168.1.225");
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:start", "null"));
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:end", "null"));
printf("%s\n", iniparser_getstring(ini, "filepath:leasefile", "null"));
printf("%s\n", iniparser_getstring(ini, "network:interface", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns2", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:subnet", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:router", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:domain", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:lease", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t2", "null"));
fp = fopen(PATH, "w");
if( fp == NULL ) {
printf("stone:fopen error!\n");
exit(-1);
}
iniparser_dumpsection_ini(ini, "ipaddrpool", fp);
iniparser_dumpsection_ini(ini, "filepath", fp);
iniparser_dumpsection_ini(ini, "network", fp);
iniparser_dumpsection_ini(ini, "opt", fp);
fclose(fp);
iniparser_freedict(ini);
return 0;
}
4.3 演示效果
五、总结
?文件配置解析在大型项目中有着举足轻重的作用,可大大提高开发者的开发效率,同时可以提高项目在实际环境中的部署效率。
|