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

2021-06-21 23:47:33 字數 3287 閱讀 6474

設計需求:

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中,完成讀入文字工作。其中比較值得關注的是以下為體,你知道為什麼這麼做麼?

用ifstream和getline來讀入而不是用fopen和fread。

用is_open判斷是否開啟,而不是直接讀取。

用vector的push_pack而不是insert。

用empty判斷是否為空,而不是用size()==0。

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()

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

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

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

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

用C 讀寫ini配置檔案

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