用STL快速編寫ini配置檔案識別類

2021-04-18 07:38:57 字數 3458 閱讀 5276

winter

ini檔案是技術人員經常用到的一種系統配置方法,如何讀取和快速識別ini檔案中的內容實現起來比較繁瑣。stl強大的功能在於能快速的實現排序、查詢、 識別等功能。本文通過stl中的map,string,vector,ifstream等,來快速實現ini檔案的識別類class inifile?

。inifile可以實現常見查詢功能,並提供完整的原始碼。

ini檔案的格式一般如下:

[section1]

key1=value1

key2=value2

......

[section2]

key1=value1

key2=value2 #注釋

......

實際的例子是:

#ini for path

[path]

dictfile = /home/tmp/dict.dat

inputfile= /home/tmp/input.txt

outputfile= /home/tmp/output.txt

#ini for exe

[exe]

user= winter //user name

passwd= 1234567 #pass word

database= mydatabase

其中有五種元素:section 名,key名,value值,注釋 #或者//開頭,標誌字元"[" "]" "="。查詢項的對應關係為sectiong-key和value對應。需要得到是value。class inifile?

要實現的是兩個函式:讀入ini檔案,讀取sect-key對應的value值。即實現下面的介面:

class inifile;
用ifstream按行讀入ini檔案的內容

識別每一行的字串,分析出sectiong,key,value,和注釋。

用map來記錄所有的sectiong-key和value。

重新定義class inifile?

typedef map> strmap;

typedef strmap::iterator strmapit;

const char*const middlestring = "_____***_______";

class inifile

; ~inifile( ){};

bool open(const char* pinipath)

string read(const char*psect, const char*pkey)

protected:

bool do_open(const char* pinipath)

if(strvect.empty())

return false;

for_each(strvect.begin(), strvect.end(), analyzeini(c_inimap));

return !c_inimap.empty();

}strmap c_inimap;

};

其中do_open是用來真正實現初始化ini內容的函式。先用ifstream fin開啟乙個檔案,然後用is_open判斷檔案是否正常開啟。順序讀取檔案的時候用eof()判斷是否到檔案尾。getline是乙個字元處理函式:直接從fin中讀取一行。然後用while迴圈過濾一行末尾的空格等字元。最後儲存到乙個vector中,完成讀入文字工作。其中比較值得關注的是以下為體,你知道為什麼這麼做麼?

truct analyzeini

void operator()( const string & strini)

if(strsect.empty())

return ;

if((first=strini.find('='))== string::npos)

return ;

string strtmp1= strini.substr(0,first);

string strtmp2=strini.substr(first+1, string::npos);

first= strtmp1.find_first_not_of(" /t");

last = strtmp1.find_last_not_of(" /t");

if(first == string::npos || last == string::npos)

return ;

string strkey = strtmp1.substr(first, last-first+1);

first = strtmp2.find_first_not_of(" /t");

if(((last = strtmp2.find("/t#", first )) != string::npos) ||

((last = strtmp2.find(" #", first )) != string::npos) ||

((last = strtmp2.find("/t//", first )) != string::npos)||

((last = strtmp2.find(" //", first )) != string::npos))

last = strtmp2.find_last_not_of(" /t");

if(first == string::npos || last == string::npos)

return ;

string value = strtmp2.substr(first, last-first+1);

string mapkey = strsect + middlestring;

mapkey += strkey;

(*pmap)[mapkey]=value;

return ;

}};

這裡大量使用了字串的查詢和字串功能。string的find_last_of系列和find系列,功能確實十分強大。所有在string中沒有找到都會返回乙個變數string::npos。

函式先找sectiong,然後分離key值和value值。符合要求的,把section和key值通過中間加上middlestring組成乙個新的string,插入map中。這裡值得注意的是:

* for_each的使用,結構可以傳遞引數。 * string的查詢函式及返回值 * string的鏈結和合併函式。 * map的下標操作符的使用。

#include #include "inifile.h"

using namespace std;

int main()

{ inifile ini;

if(!ini.open("test.ini"))

return -1;

string strvalue = ini.read("sect1","key1");

if(strvalue.empty())

return -1;

else

cout<<"value="<

用STL快速編寫ini配置檔案識別類

inifileanalyse.h檔案 include include include include include include using namespace std typedef map strmap typedef strmap iterator strmapit const char ...

用STL快速編寫ini配置檔案識別類

設計需求 ini檔案的格式一般如下 section1 key1 value1 key2 value2 section2 key1 value1 key2 value2 注釋 實際的例子是 ini for path path dictfile home tmp dict.dat inputfile h...

用C 讀寫ini配置檔案

ini就是擴充套件名為 ini 的檔案,其實他本身是個文字檔案,可以用記事本打工,主要存放的是使用者所做的選擇或系統的各種引數.ini檔案其實並不是普通的文字檔案.它有自己的結構.由若干段落 section 組成,在每個帶括號的標題下面,是若干個以單個單詞開頭的關鍵字 keyword 和乙個等號,等...