Windows中有GetPrivateProfileString 和WritePrivateProfileString函數可以進行讀寫INI配置文件,但這兩個函數每取出一個數據,都要打開文件,在文件中進行搜索,這樣處理的效率肯定會很慢,因此下面提供了一個將配置文件讀入內存中的做法,這樣做的好處是一次讀取文件,快速搜索(使用Map映射)。可以將所有數據全部保存成字符串或者文件。
INI配置文件主要由四部分組成:組、鍵值、內容、註釋和空行,下面給出一個例子文件進行說明
文件:E:/boot.ini
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
[boot loader] ;這裏是一個組,下面的兩行配置數據隸屬於該組
timeout=1 ;這裏在等號前面的是一個鍵值,等號後面的是一個內容
default=multi(0)disk(0)rdisk(0)partition(2)/WINNT;下面一行是一個空行
[operating systems];所有在';'後面的字符都屬於註釋,本程序不支持REM形式的註釋
multi(0)disk(0)rdisk(0)partition(2)/WINNT="Microsoft Windows 2000 Professional" /fastdetect;sadfkl;
C:/="Microsoft Windows"
好了,知道了INI文件的結構,開始分析INI文件讀入內存後應使用的數據結構。
一個INI文件可以看作是由一些組以及每個組下面的數據組成的,組是字符串形式的,而數據是一個比較複雜的對象。爲了搜索的方便,所以這裏採用了CMapStringToPtr來組織整個INI文件,這樣的話可以由組的字符串方便地查詢到該組中的數據
一個組下面的數據是由一些鍵值—à內容組成的映射關係,所以使用CMapStringToString來組這這些數據是最好不過的選擇了。
下面給出這個類的頭文件和實現部分。給出之前簡單介紹該類的用法:
讀取上述E:/boot.ini文件:
#include "cfgdata.h"
CCfgData CfgData;
//Load INI文件
CfgData.LoadCfgData("E://boot.ini");
CString str;
long l=0;
//設置當前組
CfgData.SetGroup("boot loader");
//讀取long型數據到變量l
CfgData.GetLongData("timeout",l);
//讀取字符串型數據到變量str
CfgData.GetStrData("default",str);
//設置當前組
CfgData.SetGroup("operating systems");
//讀取字符串型數據到變量str
CfgData.GetStrData("multi(0)disk(0)rdisk(0)partition(2)//WINNT",str);
//讀取字符串型數據到變量str
CfgData.GetStrData("C://",str);
//將整個配置數據保存進入字符串中
CfgData.SaveToStr(&str);
//將整個配置數據保存進入文件中,注意配置數據相互之間沒有順序關係,
//所以可能組和組之間、一個組的幾個鍵值--->內容配對之間的順序將會
//和以前不一致,另外所有的註釋和空行丟失
CfgData.SaveCfgData("E://boot2.ini");