在實際軟體專案中,將軟體選項外部化至配置檔是常見做法。Windows 平台慣用的 INI 格式因結構簡單、易讀易寫而廣受歡迎。本文介紹一個名為 ini_parser 的 C++ 類別,能解析 INI 格式的字串與檔案,並支援將記憶體資料寫回檔案,相容 Windows、Linux、Android 等多平台(目前暫不支援區塊/群組功能)。
ini_parser 採用面向對象風格的 C 介面設計,透過函數指標實現多態行為:
struct ini_parser {
struct single_list *keyvalues; // 內部鍵值鏈表
int (*parse_file)(struct ini_parser*, const char* file);
int (*parse_string)(struct ini_parser*, const char* text);
char* (*value)(struct ini_parser*, const char* key);
void (*set_value)(struct ini_parser*, const char* key, const char* value);
void (*remove)(struct ini_parser*, const char* key);
int (*save_to_file)(struct ini_parser*, const char* file);
void (*deletor)(struct ini_parser* ini);
};
struct ini_parser* new_ini_parser();
注意:呼叫 deletor 後,該實例將不可再使用。
內部以單向鏈表儲存鍵值對:
struct tag_value_pair {
struct slist_node node;
char *szTag; // 鍵名
char *szValue; // 鍵值
};
輔助函式包含節點建立、釋放、鍵值比對與行解析邏輯。
parse_file:逐行讀取檔案,呼叫 parse_line 解析每行parse_string:以換行符分割字串並逐行解析parse_line:跳過空白、註解(# 開頭)與區塊標記([ 開頭),提取 key=value 格式資料value:依鍵名查找對應值set_value:更新既有鍵值或新增鍵值對remove:移除指定鍵值對save_to_file 將記憶體中所有鍵值對以 key=value\n 格式寫入檔案。
static char* g_szIniString = "#abc\nfirst=2\nsecond\nname=charlizhang\n";
void ini_parser_test_string() {
struct ini_parser* ini = new_ini_parser();
int size = ini->parse_string(ini, g_szIniString);
// 驗證解析結果
assert(size > 0);
assert(ini->value(ini, "second") == 0); // 無值鍵
assert(ini->value(ini, "abc") == 0); // 註解行
assert(ini->value(ini, "name") != NULL);
assert(ini->value(ini, "first") != NULL);
// 修改與儲存
ini->set_value(ini, "baidu", "hahaha");
ini->save_to_file(ini, "write.conf");
ini->remove(ini, "first");
ini->save_to_file(ini, "write2.conf");
ini->deletor(ini);
}
此解析器功能精簡、無外部依賴、程式碼可讀性高,已於實際專案中穩定運行。若需支援區塊功能,可擴充資料結構為二層映射(區塊 → 鍵值表)。