設計需求:
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 和乙個等號,等...