1. 程式人生 > >WIN32讀寫INI檔案方法

WIN32讀寫INI檔案方法

概述


在程式中經常要用到設定或者其他少量資料的存檔,以便程式在下一次執行的時候可以使用,比如說儲存本次程式執行時視窗的位置、大小、一些使用者設定的 資料等等,在 Dos 下程式設計的時候,我們一般自己產生一個檔案,由自己把這些資料寫到檔案中,然後在下一次執行的時候再讀出來使用。在 Win32 程式設計中當然你也可以這樣幹,但 Windows 已經為我們提供了兩種方便的辦法,那就是使用登錄檔或者 ini 檔案(Profile)來儲存少量資料。本文中先介紹一下 .ini 檔案的使用。


ini 檔案是文字檔案,中間的資料格式一般為: 
[Section1 Name] 
KeyName1=value1 
KeyName2=value2 
...


[Section2 Name] 
KeyName1=value1 
KeyName2=value2


ini 檔案可以分為幾個 Section,每個 Section 的名稱用 [] 括起來,在一個 Section 中,可以有很多的 Key,每一個 Key 可以有一個值並佔用一行,格式是 Key=value,Win32 對 ini 檔案操作的 api 中,有一部分是對 win.ini 操作的,有一部分是對使用者自定義的 ini 檔案操作的。Win.in 和 system.ini 是Windows的兩個非常重要的初始化檔案,Windows將使用者所作的選擇以及各種變化的系統資訊記錄在這兩個檔案中。System.ini 描述了系統硬體的當前狀態,Win.ini 檔案則包含了Windows 系統執行環境的當前配置。由於 Win.ini 檔案的重要性和常用性,Win32 中有專門對 Win.ini 進行操作的 api,它們是:


GetProfileInt - 從 Win.ini 檔案的某個 Section 取得一個 key 的整數值,它的原形是:


GetProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
INT nDefault // 如果 Key 值沒有找到,則返回預設的值是多少 
);


如果 Key 值沒有找到的話,返回值是 nDefault 指定的預設值,如果 Key 中的值是負數,則返回 0,如果 Key 指定的是數字和字串的混合,則返回數字部分的值,比如說 x=1234abcd,則返回 1234




GetProfileString - 從 Win.ini 檔案的某個 Section 取得一個 key 的字串,它的原形是:


GetProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
LPCTSTR lpDefault, // 如果 Key 值沒有找到,則返回預設的字串的地址 
LPTSTR lpReturnedString, // 返回字串的緩衝區地址 
DWORD nSize // 緩衝區的長度 
);


返回的字串在緩衝區內,返回的 eax 值是返回的字串的長度(不包括尾部的0)




GetProfileSection - 從 Win.ini 檔案中讀出整個 Section 的內容,它的原形是:


GetProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPTSTR lpReturnedString, // 返回資料的緩衝區地址 
DWORD nSize // 返回資料的緩衝區長度 
);




WriteProfileSection - 將一個整個 Section 的值 寫入 Win.ini 檔案的指定 Section 中,它的原形是:


WriteProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpString // 要寫入的資料的地址 
);


如果 Win.ini 沒有指定的 Section,API 會新建立一個並寫入資料,如果已經存在,則先刪除原來 Seciton 中所有的 Key 值然後寫入新的。




WriteProfileString - 將一個 Key 值寫入 Win.ini 檔案的指定 Section 中,它的原形是:


WriteProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
LPCTSTR lpString // 要寫的字串地址 
);


如果 Win.ini 沒有指定的 Section,API 會新建 Section,如果沒有指定的 Key 則新建一個 Key 並寫入資料,如果已經存在,則用字串代替原來的值。 
以上的 Api 是對 Win.ini 操作的,當然對於我們來說,用的更多的是在程式執行的目錄中建立自己的 ini 檔案,如果需要對自己的 ini 檔案操作,就要用到另一組 Api,這一組 api 和上面的很象,只要把上面一組的 Profile 換成 PrivateProfile(私有的)就可以了,引數中也相應的多了一個 ini 檔名的引數。例如 GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString 等等, 下面分別介紹:


GetPrivateProfileInt - 從 ini 檔案的某個 Section 取得一個 key 的整數值,它的原形是:


GetPrivateProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
INT nDefault // 如果 Key 值沒有找到,則返回預設的值是多少 
LPCTSTR lpFileName // ini 檔案的檔名 
);


中間引數和返回值的定義和 GetProfileInt 是一樣的。




GetPrivateProfileString - 從 ini 檔案的某個 Section 取得一個 key 的字串,它的原形是:


GetPrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
LPCTSTR lpDefault, // 如果 Key 值沒有找到,則返回預設的字串的地址 
LPTSTR lpReturnedString, // 返回字串的緩衝區地址 
DWORD nSize // 緩衝區的長度 
LPCTSTR lpFileName // ini 檔案的檔名 
);




GetPrivateProfileSection - 從 ini 檔案中讀出整個 Section 的內容,它的原形是:


GetPrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPTSTR lpReturnedString, // 返回資料的緩衝區地址 
DWORD nSize // 返回資料的緩衝區長度 
LPCTSTR lpFileName // ini 檔案的檔名 
);


這個 api 可以讀出整個 section 的內容,當你不知道 section 中有哪些 key 的時候,可以使用這個 api 將整個 section 讀出後再處理。




GetPrivateProfileSectionNames - 從 ini 檔案中獲得 Section 的名稱,它的原形是:


GetPrivateProfileSectionNames( 
LPTSTR lpszReturnBuffer, // 返回資料的緩衝區地址 
DWORD nSize // 返回資料的緩衝區長度 
LPCTSTR lpFileName // ini 檔案的檔名 
);


如果 ini 中有兩個 Section: [sec1] 和 [sec2],則返回的是 'sec1',0,'sec2',0,0 ,當你不知道 ini 中有哪些 section 的時候可以用這個 api 來獲取名稱




WritePrivateProfileSection - 將一個整個 Section 的內容寫入 ini 檔案的指定 Section 中,它的原形是:


WritePrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpString // 要寫入的資料的地址 
LPCTSTR lpFileName // ini 檔案的檔名 
);




WritePrivateProfileString - 將一個 Key 值寫入 ini 檔案的指定 Section 中,它的原形是:


WritePrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址 
LPCTSTR lpString // 要寫的字串地址 
LPCTSTR lpFileName // ini 檔案的檔名 
);


如果 ini 中沒有指定的 Section,API 會新建 Section,如果沒有指定的 Key 則新建一個 Key 並寫入資料,如果已經存在,則用字串代替原來的值。當指定的 ini 也不存在的時候,API 會自動建立一個新的檔案,所以使用 ini 的好處是我們不必為了儲存少量的資料涉及到檔案操作,就連查詢檔案是否存在的操作都不必要。


使用要點:


在我們實際使用的時候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在對自定義 ini 檔案操作的時候要注意的是,如果 lpFileName 指定的檔案沒有路徑的話,Api 會去 Windows 的安裝目錄去找而不會在當前目錄找,但是每次用到 ini 函式要獲取當前路徑顯然太麻煩了,這裡有一個變通的辦法,你只要在 ini 檔名前面加上 .\ 就可以了,比如說要對本目錄下的 user.ini 操作,那麼檔名就是 '.\user.ini' 這樣顯然比較方便。另外,當你要把一個 Key 清除的時候,可以使用把 lpString 指向一個空的字串然後使用 WritePrivateProfileString。當你要把一個 section 的全部內容清空的時候,也不必把 key 一個個的清除,可以使用把 lpString 指向一個空的字串然後使用 WritePrivateProfileSection。




INI檔案就是副檔名為“ini”的檔案。在Windows系統中,INI檔案是很多,最重要的就是“System.ini”、 “System32.ini”和“Win.ini”。該檔案主要存放使用者所做的選擇以及系統的各種引數。使用者可以通過修改INI檔案,來改變應用程式和系 統的很多配置。但自從Windows 95的退出,在Windows系統中引入了登錄檔的概念,INI檔案在Windows系統的地位就開始不斷下滑,這是因為登錄檔的獨特優點,使應用程式和 系統都把許多引數和初始化資訊放進了登錄檔中。




讀寫配置檔案注意事項:


#include<windows.h>


如果是Unicode的需要LPCWSTR + _T()


如果是大字符集需要LPCSTR


純C++方式讀寫ini檔案方式→連結:


http://hi.baidu.com/xiao___q/blog/item/510013fd54365e4fd7887d6b.html