閱讀225 返回首頁    go 阿裏雲 go 技術社區[雲棲]


inifile 一個輕量級的INI文件解析庫

inifile 一個輕量級的INI文件解析庫

ini文件是一種常見的配置文件。它以簡單的文字與簡單的結構組成.INI文件會以不同的擴展名,如".ini.",".cfg",".conf"等。

INI文件的格式

INI文件由3個重要的部分組成:參數(parameters),段(sections)和注釋(comments).其格式如下:

  • 段(sections)
    [section]
  • 參數(parameters)
    name=value
  • 注釋(comments)
    ;comments

每個段包括段名,注釋,和一定的參數對,段名不可重複。段內的參數對是有序的,可重複的
注釋一般以分號“;”開頭,在分號後麵的文字,直到該行結尾都全部為注解。但是也有很多的配置文件的注釋是以“#”開頭的。

重要說明

一般來說,段與段直接的名字是不能重複的。而段內的參數對是有序的,可重複的。雖然這種重複參數的情況比較少,但是有些地方還是會用到的。如OceanBase數據庫的 Schema配置文件如下。

[sys_table]
table_id=1
max_column_id=11
table_type=1
#rowkey is table name
rowkey_is_fixed_length=0 
column_info=table_name,varchar,128
column_info=table_id,int 
column_info=table_type,int
column_info=rowkey_len,int
column_info=max_column_id,int


INI文件不一定有段名,通常此時會為其增加一個默認的段名.

示例中存在段名,段名為sys_table,在配置文件中不能再存在其他sys_table段,而該段中的存在多個column_info參數,每個參數表示sys_table中的一個字段的信息。參數rowkey_is_fixed_length還帶有注釋。

注釋是提高配置文件可讀性的重要方法。在解析的過程中一般會被忽略。但是如果你準備給你的解析庫添加一個保存到文件的功能的話,就應該考慮到用戶可能會為每個參數或者段添加注釋的可能性。

IniFile的接口設計

接口設計必須要保證足夠的穩定性和易用性。INI配置文件通常是啟動時讀,一旦啟動程序,中途幾乎不會修改配置文件。所以一個簡單的解析庫,首要目標是解決INI文件的解析,然後是在內存中修改內容,以及將內存修改後的內容保存到INI文件中去。
完整的解析至少要包括以下功能:

  • 打開並解析一個名為fname的INI文件
    int open(const string &fname);

  • 獲取section段第一個鍵為key的值,並將值賦到value中
    int getValue(const string &section,const string &key,string &value);

  • 獲取section段第一個鍵為key的值,並將值賦到value中,將注釋賦到comment中
    int getValue(const string &section,const string &key,string &value,string &comment);

  • 獲取section段所有鍵為key的值,並將值賦到values的vector中
    int getValues(const string &section,const string &key,vector<string> &values);

  • 獲取section段所有鍵為key的值,並將值賦到values的vector中,將注釋賦到comments的vector中
    int getValues(const string &section,const string &key,vector<string> &value,vector<string> &comments);

  • 獲取section段的注釋
    int getSectionComment(const string &section,string & comment);

  • 獲取注釋標記符列表
    void getCommentFlags(vector<string> &flags);

  • 設置注釋標記符列表
    void setCommentFlags(const vector<string> &flags);

如果要在程序中修改INI文件設置的值,並將修改後的內容保存到原來的INI文件或者其他文件,則需要包括以下功能:

  • 將內容保存到當前文件
    int save();
  • 將內容另存到一個名為fname的文件
    int saveas(const string &fname);
  • 同時設置值和注釋
    int setValue(const string &section,const string &key,const string &value,const string &comment="");
  • 刪除段
    void deleteSection(const string &section);
  • 刪除特定段的特定參數
    void deleteKey(const string &section,const string &key);
  • 設置section段的注釋
    int setSectionComment(const string &section,const string & comment);

IniFile的特點

  • 支持解析ini文件
  • 支持修改、保存ini文件
  • 支持設置多個注釋符,默認為“#”和';'
  • 支持參數名重複

IniFile庫既包含了INI文件的解析,也能夠修改並保存INI文件。
解析過程中如果INI文件中沒有指定段名,則會指定一個空字符串作為段名,段采用map保存,而段中的參數則采用vector保存,因此支持參數名重複。

IniFile除了適合用在一般後台程序讀取配置文件,也能夠幫助GUI界麵程序提供參數配置,修改,保存等。

IniFile的使用

使用很簡單 生成一個ini文件test.ini
cat > test.ini

#this is commit
;this is commit
[COMMON]
DB = mysql
PASSWD=root


首先指定頭文件和命名空間 然後使用open函數打開ini文件 getValue可以獲取指定段的指定項的值

#include "inifile.h"
using namespace inifile;

filepath = "test.ini";

IniFile ini;

ini.open(filepath);

//獲取指定段的指定項的值
string db_name = ini.getValue("COMMON","DB");
//設置新值和注釋
ini.setValue("TEST","NAME","root","用戶名稱");
//保存到文件
ini.save();



IniFile庫的地址為:

https://github.com/Winnerhust/inifile2

歡迎光臨我的網站----蝴蝶忽然的博客園----人既無名的專欄
如果閱讀本文過程中有任何問題,請聯係作者,轉載請注明出處!


最後更新:2017-04-03 05:39:54

  上一篇:go 王泛森院士——如果讓我重新讀次研究生
  下一篇:go 【算法小總結】二分圖最大匹配的非遞歸方法