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 §ion,const string &key,string &value);
-
獲取section段第一個鍵為key的值,並將值賦到value中,將注釋賦到comment中
int getValue(const string §ion,const string &key,string &value,string &comment);
-
獲取section段所有鍵為key的值,並將值賦到values的vector中
int getValues(const string §ion,const string &key,vector<string> &values);
-
獲取section段所有鍵為key的值,並將值賦到values的vector中,將注釋賦到comments的vector中
int getValues(const string §ion,const string &key,vector<string> &value,vector<string> &comments);
-
獲取section段的注釋
int getSectionComment(const string §ion,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 §ion,const string &key,const string &value,const string &comment="");
- 刪除段
void deleteSection(const string §ion);
- 刪除特定段的特定參數
void deleteKey(const string §ion,const string &key);
- 設置section段的注釋
int setSectionComment(const string §ion,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庫的地址為:
歡迎光臨我的網站----蝴蝶忽然的博客園----人既無名的專欄。
如果閱讀本文過程中有任何問題,請聯係作者,轉載請注明出處!
最後更新:2017-04-03 05:39:54