前面介绍过获取系统当前工作目录的方法,在此基础上,可以完成对配置文件的操作。配置文件大大提高了程序的灵活性。对用户而言,他们可以根据自己的和需求修改相应的数据,一个简单的例子就是宏RGB(param1,param2,param3),它的三个参数,它们的取值范围均为0~255。在程序中当前只能设定一种颜色,但如果将这三个参数写入配置文件中,那么颜色的组合就有256*256*256种组合,包含了所有人眼可以识别的颜色,大大提高了程序的灵活性;另一方面,于开发者而言,最明显的好处就是在调试程序只需修改一处即可改变所有相关的颜色,不必在每一个用到它的地方去校正数据是否一致等问题。配置文件对于程序中需要经常变更的数据非常必要。切入正题,对文件进行操作首先还是必须获取文件的工作路径。
1) 获取文件的路径。前面介绍了获取系统当前的工作路径,代码如下:
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL, szPath, MAX_PATH);
CString PathName(szPath);
//获取exe目录
CString PROGRAM_PATH = PathName.Left(PathName.ReverseFind(_T('\\')) + 1);
PROGRAM_PATH+=_T("Data\\Record.ini");
说明:上述代码执行结果是获取 Debug目录下的文件夹Data里的Record.ini的目录(绝对路径),这里的Record.ini即为配置文件
2) 从Record.ini文件中读数据
以MFC中两种内置类型CString和int为例,其他依次类推。
还是先介绍一下配置文件的格式。
早期的Windows桌面系统,主要使用ini文件作为系统的配置文件,从Win95 以后开始转向使用注册表,但是还有很多系统的配置是使用ini文件的。其实,ini文件就是简单的text 文件,只不过这种txt 文件要遵循一定的ini文件格式。“.ini” 就是英文 “initialization” 的头三个字母的缩写;当然ini file 的后缀名也不一定是".ini"也可以是".cfg"、.conf ”或者".txt"。
Ini文件最基本的三个要素:parameters,sections 和 comments
ini文件所包含的最基本的“元素”就是parameter,每一个parameter都有一个name和一个value,name和value由等“=”隔开,name在等号的左边。如:name = value。所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都在方括号[]内。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束。section 如: [section]。关于comments,在ini文件中注释语句是以分号“;”开始的,所有的注释语句不管多长都是独占一行直到结束。在分号和行结束符之间的所有内容都是被忽略的。
以上是ini文件的基本格式信息。
从ini文件中读数据,首先,文件中需要有数据,按照上面的格式在配置文件中写如下数据:
[person]
name = 李明
age = 20
在View类中添加两个成员变量:CString m_strName 和int m_iAge。这两个成员变量分别存储从配置文件中读取的name和age的value。
这里有必要介绍一个函数,它能有效地从配置文件中获取指定的字段。
GetPrivateProfileString
函数原型为:
DWORD GetPrivateProfileString(lpszSection, lpszKey, lpszDefault, lpszReturnBuffer, cchReturnBuffer, lpszFile)
参数说明:
lpszSection 配置文件的section名
lpszKey 配置文件的key名
lpszDefaul 如果INI文件中没有前两个参数指定的字段或键名,则将此值赋给变量
lpszReturnBuffer 接收INI文件中的值的CString对象,即目的缓存器.
cchReturnBuffer 目的缓存器的大小
lpszFile 是完整的INI文件名(ini文件的系统绝对路径名)
因此在加载配置文件数据的函数中添加代码:
GetPrivateProfileString(_T("person"), _T("name"), _T("佚"),m_strName.GetBuffer(MAX_PATH),MAX_PATH,PROGRAM_PATH);
这里的MAX_PATH是系统定义的宏,不必理会,总之不会越界。这样,成员变量m_strName从Debug目录下的Data文件夹中的Record.ini文件中获取到了值 ,即:m_strName的值为 李明。获取整形值比获取字符串稍微简单一点。从配置文件中获取int型数据需用到函数
GetPrivateProfileInt(lpszSection, lpszKey, lpszDefault,lpszFile)
参数含义参照从配置文件中获取字符串函数的参数说明,不再重复。
因此在加载配置文件数据的函数中添加代码:
m_iAge=GetPrivateProfileInt(_T("person"),T("age"),9,PROGRAM_PATH);
执行结果:成员变量m_iAge从Debug目录下的Data文件夹中的Record.ini文件中获取到了值 ,即:m_iAge的值为 9
以上即为从配置文件中获取字符串和整形数据的方法。下面就是数据的存储,同样以CString和int型为例,其他类型同理。
3) 向ini文件中写入数据
向ini文件中写入数据只需用到一个函数WritePrivateProfileString
函数原型为:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
其中各参数的意义
LPCTSTR lpAppName 是INI文件中的一个section
LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型
LPCTSTR lpFileName 是完整的INI文件名.
从第三个参数知,整形的存储必须首先转换为CString类型。在向ini文件中写入数据之前需先对其赋值。
写入 name为李刚 age为40
m_strName=_T(“李刚”);
m_iAge=40;
添加如下代码:
CString strTemp;
strTemp.Format(_T("%d"),m_iAge);
::WritePrivateProfileString(_T("person"), _T("name"),m_strName,PROGRAM_PATH);
::WritePrivateProfileString(_T("person"), _T("age"),strTemp,PROGRAM_PATH);
通过上面的步骤,即完成了向Debug目录下的Data文件夹里的Record.ini文件中写入姓名和年龄。(完)