http://blog.pfan.cn/sword2008/31089.html
配置文件中經(jīng)常用到ini文件,在VC中其函數(shù)分別為:
寫入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);
讀取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);
讀取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);
其中個(gè)參數(shù)的意思:
LPCTSTR lpAppName ------- INI文件中的一個(gè)字段名
LPCTSTR lpKeyName -------- lpAppName 下的一個(gè)鍵名,也就是里面具體的變量名
LPCTSTR lpString ---------是鍵值,也就是變量的值, 必須為LPCTSTR或CString類型
LPCTSTR lpFileName --------完整的INI文件路徑名
LPCTSTR lpDefaut ----------如果沒有其前兩個(gè)參數(shù)值,則將此值賦給變量
LPSTR lpReturnedString --------接收INI文件中的值的CString對(duì)象,即接收緩沖區(qū)
DWORD nSize ------接收緩沖區(qū)的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
結(jié)果:(INI文件中顯示如下:)
[Student]
Name=jacky
讀取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
結(jié)果:SName = "jacky";這里需要注意點(diǎn)就是用完GetBuffer函數(shù)后一定要釋放(用SName.ReleaseBuffer()函數(shù)),不然后面再用到SName的其他子函數(shù)就會(huì)失靈。
讀整數(shù)比較簡(jiǎn)單,如下
int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即為所讀取的結(jié)果!
在GetPrivateProfileString最后一個(gè)參數(shù)是配置文件路徑的參數(shù),此路徑只能是絕對(duì)路徑,不能是相對(duì)路徑,但現(xiàn)在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函數(shù)。
原代碼如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();
注意:在這里使用CString變量時(shí),在使用完GetBuffer后,緊接著一定要使用ReleaseBuffer()函數(shù),才可以進(jìn)行其他的諸如字符串+操作
例如:
[settings]
remember_check=0
language_sel=0
IP_adress=192.168.1.1
Password_sel=098764
usr_name_sel=opipiio
在我們寫的程序當(dāng)中,總有一些配置信息需要保存下來(lái),以便完成程序的功能,最簡(jiǎn)單的辦法就是將這些信息寫入INI文件中,程序初始化時(shí)再讀入.具體應(yīng)用如下:
一.將信息寫入.INI文件中.
1.所用的WINAPI函數(shù)原型為:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
其中各參數(shù)的意義:
LPCTSTR lpAppName 是INI文件中的一個(gè)字段名.
LPCTSTR lpKeyName 是lpAppName下的一個(gè)鍵名,通俗講就是變量名.
LPCTSTR lpString 是鍵值,也就是變量的值,不過(guò)必須為LPCTSTR型或CString型的.
LPCTSTR lpFileName 是完整的INI文件名.
2.具體使用方法:設(shè)現(xiàn)有一名學(xué)生,需把他的姓名和年齡寫入 c:\stud\student.ini 文件中.
CString strName,strTemp;
int nAge;
strName="張三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");
此時(shí)c:\stud\student.ini文件中的內(nèi)容如下:
[StudentInfo]
Name=張三
3.要將學(xué)生的年齡保存下來(lái),只需將整型的值變?yōu)樽址图纯?span lang="EN-US">:
strTemp.format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");
二.將信息從INI文件中讀入程序中的變量.
1.所用的WINAPI函數(shù)原型為:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
其中各參數(shù)的意義:
前二個(gè)參數(shù)與 WritePrivateProfileString中的意義一樣.
lpDefault : 如果INI文件中沒有前兩個(gè)參數(shù)指定的字段名或鍵名,則將此值賦給變量.
lpReturnedString : 接收INI文件中的值的CString對(duì)象,即目的緩存器.
nSize : 目的緩存器的大小.
lpFileName : 是完整的INI文件名.
2.具體使用方法:現(xiàn)要將上一步中寫入的學(xué)生的信息讀入程序中.
CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默認(rèn)姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");
執(zhí)行后 strStudName 的值為:"張三",若前兩個(gè)參數(shù)有誤,其值為:"默認(rèn)姓名".
3.讀入整型值要用另一個(gè)WINAPI函數(shù):
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
這里的參數(shù)意義與上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");
三.循環(huán)寫入多個(gè)值,設(shè)現(xiàn)有一程序,要將最近使用的幾個(gè)文件名保存下來(lái),具體程序如下:
1.寫入:
CString strTemp,strTempA;
int i;
int nCount=6;
文件://共有6個(gè)文件名需要保存
for(i=0;i {strTemp.format("%d",i);
strTempA=文件名;
文件://文件名可以從數(shù)組,列表框等處取得.
::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,
"c:\\usefile\\usefile.ini");
}
strTemp.format("%d",nCount);
::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");
文件://將文件總數(shù)寫入,以便讀出.
2.讀出:
nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");
for(i=0;i {strTemp.format("%d",i);
strTemp="FileName"+strTemp;
::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");
文件://使用strTempA中的內(nèi)容.
}
補(bǔ)充四點(diǎn):
1.INI文件的路徑必須完整,文件名前面的各級(jí)目錄必須存在,否則寫入不成功,該函數(shù)返回 FALSE 值.
2.文件名的路徑中必須為 \\ ,因?yàn)樵?span lang="EN-US">VC++中, \\ 才表示一個(gè) \ .
3.也可將INI文件放在程序所在目錄,此時(shí) lpFileName 參數(shù)為: ".\\student.ini".
4.從網(wǎng)頁(yè)中粘貼源代碼時(shí),最好先粘貼至記事本中,再往VC中粘貼,否則易造成編譯錯(cuò)誤,開始時(shí)我也十分不解,好好的代碼怎么就不對(duì)呢?后來(lái)才找到這個(gè)方法.還有一些代碼中使用了全角字符如:<,\等,也會(huì)
造成編譯錯(cuò)誤.