GLib 就是懶.用 GKeyFile 存取設定檔

過去曾撰文寫過『GLib』相關文章『初探 Glib Programing - I/O 處理事件化 g_io_channel』,其中講到 GLib 提供了許多功能的包裝,除了能讓程式開發者『輕易』實現『重覆又無聊』的功能外,又能確保其功能的穩定性,讓程式開發更容易且更簡潔有效率。如諧音『 G.Lib - 就是.懶』,將它說是應用程式開發者的『懶人包』,可是一點也不為過呀。

Glib Utilities 中有個函式包裝『GKeyFile』,此包裝提供一個存取設定檔的界面,讓程式開發者不再需要為了讀取設定檔,而被迫自行撰寫許多程式來處理檔案資料流和分析設定檔,是個非常省時省力的函式包裝。

GKeyFile 存取的設定檔,就是一個 .ini 檔的形式,大致上像:
[group1]
mykey1=66
mykey2=Hello World

[group2]
yourkey1=yes
yourkey2=3.1415926


想使用 GKeyFile 撰寫程式讀取並顯示設定檔的內容,程式碼如下:
#include <stdio.h>
#include <glib.h>

void main(void)
{
GKeyFile *keyfile;
GKeyFileFlags flags;
GError *error = NULL;

/* 初始化 GKeyFile */
keyfile = g_key_file_new();
flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;

/* 讀取 config file */
if (!g_key_file_load_from_file (keyfile, "helloworld.conf", flags, &error))
return;

/* 讀取設定並顯示 */
printf("[Group1]\n");
printf("mykey1: %d\n", g_key_file_get_integer(keyfile, "group1", "mykey1", NULL));
printf("mykey2: %s\n", g_key_file_get_string(keyfile, "group1", "mykey2", NULL));

printf("[Group2]\n");
if (g_key_file_get_boolean(keyfile, "group2", "yourkey1", NULL))
printf("yourkey1: true\n");
else
printf("yourkey1: true\n");

printf("yourkey2: %lf\n"g_key_file_get_double(keyfile, "group2", "yourkey2", NULL));
}


一切就這麼簡單,使用『GKeyFile』,能馬上為你的應用程式加上設定檔支援。而且, GKeyFile 提供數種存取的資料類型,包括了字串(String)、整數(Integer)、布林值(Boolean)、雙倍浮點數(Double-float)等,能符合大多數符合開發者需求。還有更多的功能和細節,可參考官方『GLib Reference Manual - Key-value file parser』,裡面有更完整的說明。

後記

使用 C 語言開發的程式,往往效能高,可是穩定性及安全性並不好。其實這並非 C 語言本身問題,原因常出在於程式開發者。由於 C 語言建構在一個很低階的控制層面,所以常會因設計者疏忽而導致嚴重的錯誤和問題,若是單單程式 Crash 還算好,要是造成整個系統的不穩定,就麻煩大了。 使用 GLib 可減少這類問題的發生,因為許多繁雜的功能,不再需要開發者每次都得重複撰寫,大量避免意料之外的情況發生。

留言

  1. 幫你補充,你漏了一個最大的重點。
    GKeyFile 不只是 ini,其實他可以說是為了 freedesktop.org Desktop Entry spec 打造

    他有個 API:
    g_key_file_get_locale_string()

    這是很特別其他 ini 檔所沒有的東西

    [Desktop Entry]
    Name=Terminal
    Name[zh_TW]=終端機

    同一個 key 在不同 locale 值不一樣
    這才是他最有特色的功能

    回覆刪除
  2. That's cool!

    我倒沒發現有這種支援 :P

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄