1. 程式人生 > >VS 儲存INI配置檔案和讀取配置檔案

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。