Linux下解析配置文件和GKeyFile读取配置文件
2015-09-08 16:45
573 查看
本文主要转载两篇文章:来对GKeyFile的讲解
一./article/1795912.html
二.http://blog.chinaunix.net/uid-199788-id-2420084.html
一.Linux下解析配置文件
配置文件在Linux下使用得非常普遍。形如下面的这个文件就是一个典型的配置文件:
在Windows系统中,也存在这类文件,通常后缀名是ini。在GTK的世界中,称这类文件为Key File(因为这个文件包含很多的字段(key)?)。这两类文件看上去差不多,但是还是有一些区别的:
首先就是注释,init文件把“;”视作注释开始,而Key File,显然是用“#”
Key File所有的配置项都在配置段中,即任何配置项之前肯定有类似”[配置段]“的东西。
还有就是众所周知的,Windows下的ini文件通常不是UTF8编码,而Linux下,显然推荐这么干
另外就是配置项和配置段大小写,Linux下的key file是区分的
在Keyfile中允许数据类型为逻辑型的配置项,取值为true或者false。而ini文件里大概只有用整形的配置项目与之对应了
使用下面的命令编译:
这里的
我们用的范例配置文件(援引自pacman的配置文件)如下:
运行效果怎么样呢?
范例程序很简单,但是五脏俱全,要使用glib来解析配置文件,大概有下面的几个流程:
首先用g_key_file_new()建立一个GKeyFile缓冲区
然后用g_key_file_load_from_file()来初始化填充这个缓冲区
接着,你就可以用g_key_file_get_数据类型()来获取数据了
或者,使用g_key_file_set_数据类型()来更新设置数据
而且,使用g_key_file_remove_key()来删除设置项
那么增加设置项呢?当设置数据时,如果没有该数据项,默认就会增加
当然,在此之前,如果不放心的话,还可以通过g_key_file_has_group()、g_key_file_has_key()来判断数据段、数据项是否存在
末了,你可能想把更新后的配置写回去,这个有点怪,需要用g_key_file_to_data()将缓冲区里的配置数据转成字符串,然后将这个字符串写入到配置文件即可。这个函数同时也会返回字符串的长度,供写入时使用
最后,一个良好的习惯——调用g_key_file_free()来释放缓冲区
数据类型包括字符串、整形、长整型、浮点……,以及这类数据组成的数组。
另外glib甚至还可以读写各个配置项上的注释,神奇吧?
更多的神奇,还是参考glib的官方文档去吧。
另外,听说还有个叫做iniparser的小玩意,也是干这事儿的,大家有空没空可以去围观一下。
http://tiaozhanshu.com/node/313
二.GKeyFile读取配置文件
对于GKeyFile生成的格式文件,同样可以通过此数据结构进行读取文件中的配置信息,生成的配置文件内容为:
这次使用GKeyFile将其中的每一键项读取出来,进行输出。程序代码:
一./article/1795912.html
二.http://blog.chinaunix.net/uid-199788-id-2420084.html
一.Linux下解析配置文件
配置文件在Linux下使用得非常普遍。形如下面的这个文件就是一个典型的配置文件:
# this is just an example # there can be comments before the first group [First Group] Name=Key File Exampletthis value showsnescaping # localized strings are stored in multiple key-value pairs Welcome=Hello Welcome[de]=Hallo Welcome[fr_FR]=Bonjour Welcome[it]=Ciao Welcome[be@latin]=Hello [Another Group] Numbers=2;20;-200;0 Booleans=true;false;true;true
在Windows系统中,也存在这类文件,通常后缀名是ini。在GTK的世界中,称这类文件为Key File(因为这个文件包含很多的字段(key)?)。这两类文件看上去差不多,但是还是有一些区别的:
首先就是注释,init文件把“;”视作注释开始,而Key File,显然是用“#”
Key File所有的配置项都在配置段中,即任何配置项之前肯定有类似”[配置段]“的东西。
还有就是众所周知的,Windows下的ini文件通常不是UTF8编码,而Linux下,显然推荐这么干
另外就是配置项和配置段大小写,Linux下的key file是区分的
在Keyfile中允许数据类型为逻辑型的配置项,取值为true或者false。而ini文件里大概只有用整形的配置项目与之对应了
//简单介绍完了,我们在用一个简单的例子: #include #include int main(int argc, char **argv) { GKeyFile * config; gchar *str; config = g_key_file_new(); g_key_file_load_from_file(config, argv[1], 0, NULL); str=g_key_file_get_string(config,"options","HoldPkg",NULL); printf("HoldPkg of options section is "%s"n", str); g_key_file_free(config); return 0; }
使用下面的命令编译:
gcc `pkg-config --cflags --libs glib-2.0` dummy.c
这里的
pkg-config –cflags –libs glib-2.0用于自动查找调用glib所需的头文件和库文件路径,并且按照CFLAGS所需的格式输出。
我们用的范例配置文件(援引自pacman的配置文件)如下:
[options] HoldPkg = pacman glibc
运行效果怎么样呢?
athurg@AT.nts-intl.com tmp]$./a.out /etc/pacman.conf HoldPkg of options section is "pacman glibc"
范例程序很简单,但是五脏俱全,要使用glib来解析配置文件,大概有下面的几个流程:
首先用g_key_file_new()建立一个GKeyFile缓冲区
然后用g_key_file_load_from_file()来初始化填充这个缓冲区
接着,你就可以用g_key_file_get_数据类型()来获取数据了
或者,使用g_key_file_set_数据类型()来更新设置数据
而且,使用g_key_file_remove_key()来删除设置项
那么增加设置项呢?当设置数据时,如果没有该数据项,默认就会增加
当然,在此之前,如果不放心的话,还可以通过g_key_file_has_group()、g_key_file_has_key()来判断数据段、数据项是否存在
末了,你可能想把更新后的配置写回去,这个有点怪,需要用g_key_file_to_data()将缓冲区里的配置数据转成字符串,然后将这个字符串写入到配置文件即可。这个函数同时也会返回字符串的长度,供写入时使用
最后,一个良好的习惯——调用g_key_file_free()来释放缓冲区
数据类型包括字符串、整形、长整型、浮点……,以及这类数据组成的数组。
另外glib甚至还可以读写各个配置项上的注释,神奇吧?
更多的神奇,还是参考glib的官方文档去吧。
另外,听说还有个叫做iniparser的小玩意,也是干这事儿的,大家有空没空可以去围观一下。
http://tiaozhanshu.com/node/313
二.GKeyFile读取配置文件
对于GKeyFile生成的格式文件,同样可以通过此数据结构进行读取文件中的配置信息,生成的配置文件内容为:
[STARTUP] x=300 y=600 center=true timestamp=1314432584 random=0.78204092288815774 [PATH] bin_path=/bin;/sbin;/usr/bin;/usr/local/bin;/home/jcodeer/bin;
这次使用GKeyFile将其中的每一键项读取出来,进行输出。程序代码:
#include int main(int argc,char** argv){ GKeyFile* config = g_key_file_new(); g_key_file_load_from_file(config,"./019.ini",G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS,NULL); #define STARTUP "STARTUP" #define PATH "PATH" gchar* x = g_key_file_get_value(config,STARTUP,"x",NULL); g_print("x = %s\n",x); gchar* y = g_key_file_get_string(config,STARTUP,"y",NULL); g_print("y = %s\n",y); gboolean center = g_key_file_get_boolean(config,STARTUP,"center",NULL); g_print("center = %d\n",center); gint timestamp = g_key_file_get_integer(config,STARTUP,"timestamp",NULL); g_print("timestamp = %u\n",timestamp); gdouble random = g_key_file_get_double(config,STARTUP,"random",NULL); g_print("random = %0.10f\n",random); gsize length,i; gchar** bin_path = g_key_file_get_string_list(config,PATH,"bin_path",&length,NULL); g_print("bin_path="); for(i = 0; i < length;i++){ g_print("%s;",bin_path[i]); } g_print("\n"); #undef STARTUP #undef PATH g_key_file_free(config); return 0; }
相关文章推荐
- linux线程属性设置
- 2015年9月1日作业提交(关于硬盘分区格式化)
- export CROSS_COMPILE=arm-linux-gnueabi- 之后,无法编译kernel
- 新手指南: Linux 新手应该知道的 26 个命令
- Linux系统下程序后台运行nohup,&,screen等
- 【linux】/dev/null与/dev/zero详解
- linux学习-pipe
- Linux常用命令征集
- CentOS 中 make: g++ command not found
- linux上部署web项目
- CentOS iptables防火墙的基本应用讲解
- linux多线程简介(-)
- CentOS查看一共安装了多少软件包,是那些软件包
- Linux中如何配置IP
- linux端口被占用问题解决方案
- Centos6.5安装配置SVN
- CentOS添加路由
- linux常用命令(18):locate命令
- linux 下取进程占用 cpu/内存 最高的前10个进程
- linux学习---select的用法