在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入

配置文件中经常用到ini文件,在VC中其函数分别为:

写入.ini文件:bool WritePrivateProfileString(LPCTSTRlpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTRlpFileName);
读取.ini文件:DWORD GetPrivateProfileString(LPCTSTRlpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTRlpReturnedString,DWORD nSize,LPCTSTR lpFileName);
读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTRlpKeyName,INT nDefault,LPCTSTR lpFileName);
其中个参数的意思:
LPCTSTR lpAppName ------- INI文件中的一个字段名
LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名
LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型
LPCTSTR lpFileName --------完整的INI文件路径名
LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量
LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区
DWORD nSize ------接收缓冲区的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
结果:(INI文件中显示如下:)
[Student]
Name=jacky
读取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
结果:SName ="jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
读整数比较简单,如下
int Result =GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即为所读取的结果!
在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
原代码如下:
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变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作
额外补充:
GetBuffer说白了就两个功能:
1:就是将CString里面的内存交到外部一个来处理,外部可以直接修改它的内容。
2:重新修改CString的内存大小,这个数值不包含null结尾符。
另一个典型的用法:就是将CString里面的内容变为int或long型,需要先获取里面的内存指针。这样就可以先GetBuffer(内存大小)方便直接转换。
如果在外部修改了CString里面的内容,在重新使用CString之前,需调用ReleaseBuffer()也就是说,ReleaseBuffer不需要每次都调用。
应用实列截取:
//读取ini文件
::GetPrivateProfileString(_T("Dialysis_Info1"),_T("dialysisAddress"),_T("0"),s.GetBuffer(MAX_PATH),MAX_PATH,strCommonResourcePath+"\\Configure\\configure.ini");
     s.ReleaseBuffer();//将CString里面的内容变为int或long型(???)
    ULONG DTemp = ::atol(s.GetBuffer(s.GetLength()));
//写入ini文件
ULONG DTemp = m_cMonitorPage.m_diaIP;
     s.Format(TEXT("%ld"),DTemp);
     ::WritePrivateProfileString(_T("Dialysis_Info1"),_T("dialysisAddress"),s,strCommonResourcePath+"\\Configure\\configure.ini");