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

運行效果怎麼樣呢?

[[email protected] 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章