VS 儲存INI配置檔案和讀取配置檔案
INI檔案簡介
在我們寫程式時,總有一些配置資訊需要儲存下來,以便在下一次啟動程式完成初始化,這實際上是一種類持久化。將一些資訊寫入INI檔案(initialization file)中,可完成簡單的持久化支援。
Windows提供了API介面用於操作INI檔案,其支援的INI檔案格式一般如下:
===============================
[Section1]
Key11=value11
Key12=value12
[Section2]
Key21=value21
Key22=value22
...
[SectionN]
KeyN1=valueN1
KeyN2=valueN2
===============================
一般一個INI檔案可有N個節,每節可有n個鍵名及值對應,每個鍵名及其值以等式形式佔一行。
一般鍵的名稱可任取,不過建議用有意義的字元及詞構成。值一般可為整數和字串,其它型別要進行轉換。
常見的系統配置檔案:
C:/boot.ini
C:/WINDOWS/win.ini
C:/WINDOWS/system.ini
C:/WINDOWS/desktop.ini
C:/WINDOWS/Resources/Themes/Windows Classic.theme
注意,字串存貯在INI檔案中時沒有引號;key和value之間的等號前後不容空格;註釋以分號“;”開頭。
VC中操作INI檔案的API
(1)作業系統配置檔案Win.ini的函式:
函式名 |
功能 |
GetProfileSection |
讀取win.ini中指定節lpAppName中所有鍵名及其值。lpReturnedString字串形式如下: Key1=Value1/0Key2=Value2/0…KeyN=ValueN/0/0 |
GetProfileString |
讀取win.ini中指定節lpAppName中鍵名為lpKeyName對應變數的字串值。 |
GetProfileInt |
讀取win.ini中指定節lpAppName中鍵名為lpKeyName對應變數的整數值。 |
WriteProfileSection |
寫(替換)win.ini中指定節lpAppName中的鍵值。 lpString字串形式同GetProfileSection中的lpReturnedString。 |
WriteProfileString |
寫(替換)win.ini中指定節lpAppName中鍵名為lpKeyName對應變數的字串值。 |
(2)操作使用者自定義配置檔案(PrivateProfile.ini)的函式:
函式名 |
功能 |
GetPrivateProfileSectionNames |
讀取lpFileName指定的配置檔案中所有的節名。lpszReturnBuffer字串形式如下: Section1/0Section2/0…SectionN/0/0 |
GetPrivateProfileSection |
同GetProfileSection。 |
GetPrivateProfileString |
同GetProfileString。 |
GetPrivateProfileInt |
同GetProfileInt |
GetPrivateProfileStruct |
須同WritePrivateProfileStruct配套使用。 |
WritePrivateProfileSection |
同WriteProfileSection |
WritePrivateProfileString |
同WriteProfileString |
WritePrivateProfileStruct |
不常用。 |
注意:
(1)使用得最頻繁的是GetPrivateProfileString 和WritePrivateProfileString,沒有WriteProfileInt/WritePrivateProfileInt函式。
(2)Get系列讀取節鍵值,如果檔案路徑有誤或節鍵名不對則返回設定的預設值。
(3)訪存自定義配置檔案時,檔案路徑lpFileName必須完整,檔名前面的各級目錄必須存在。如果lpFileName檔案路徑不存在,則函式返回FALSE,GetLastError() = ERROR_PATH_NOT_FOUND。如果路徑正確,但是檔案不存在,則該函式將先建立該檔案。如果路徑及檔案存在,則在現有ini檔案基礎上進行讀寫。
如果lpFileName 只指定檔名而沒有路徑的話,呼叫API將會去Windows 的安裝目錄去查詢而不會在當前目錄查詢。
(4)要對呼叫API的模組(exe)所在目錄下進行配置檔案操作,可使用形如“.//config.ini”的相對路徑,注意轉義符。
(5)呼叫WritePrivateProfileSection,若引數三lpString為NULL,則可將對應section的全部內容清空;呼叫WritePrivateProfileString,若引數三lpString為NULL,則可將對應key刪除。
跨平臺配置檔案
INI檔案本質是對檔案和字串的處理,因此在跨平臺專案中的配置檔案可以基於<stdio.h>中的標C檔案FILE,然後實現像類似以上對節([Section])、鍵(Key)和值(Value)的字串讀寫功能。
鑑於XML的樹形描述層次結構性清晰,現在很多軟體都大面積使用XML檔案進行配置,如QQ的全域性配置檔案C:/Program Files/Tencent/QQ/gf-config.xml。java程式的配置檔案基本都使用XML格式,C++中並沒有操作XML檔案的標準庫。
在C/C++程式中要使用XML做為配置檔案,涉及到XML的解析。Windows平臺可使用MsXml對XML進行解析,參考《MsXml建立和解析XML示例》,跨平臺可以考慮自己實現,或使用C++ BOOST正則表示式,或選擇Free C or C++ XML Parser Libraries,如XmlParser、TinyXML、CMarkup、libxml等。
CIniFile類
以下提供對Windows操作INI檔案的API的簡單封裝類CIniFile。