CC++ini配置⽂件的格式及读写操作
⼀、ini配置⽂件的格式
为什么要⽤INI⽂件?如果我们程序没有任何配置⽂件时,这样的程序对外是全封闭的,⼀旦程序需要修改⼀些参数必须要修改程序代码本⾝并重新编译,这样很不好,所以要⽤配置⽂件,让程序发布后还能根据需要进⾏必要的配置;配置⽂件有很多如INI配置⽂件,XML配置⽂件,还有就是可以使⽤系统注册表等。
本⽂主要是为读者在实现读写INI配置⽂件模块之前,提供有关INI⽂件的格式信息。在早期的windows桌⾯系统中主要是⽤INI⽂件作为系统的配置⽂件,从win95以后开始转向使⽤注册表,但是还有很多系统配置是使⽤INI⽂件的。其实INI⽂件就是简单的text⽂件,只不过这种txt⽂件要遵循⼀定的INI⽂件格式。现在的WINCE系统上也常常⽤INI⽂件作为配置⽂件,这次研究INI⽂件的⽬的就是为了 给我的对接报警服务程序添加配置⽂件。“.INI ”就是英⽂ “initialization”的头三个字母的缩写;当然INI file的后缀名也不⼀定是".ini"也可以
是".cfg",".conf ”或者是".txt"。
1、INI⽂件由节、键、值组成。
  [section]
新老师自我介绍
参数(键=值)
  name=value
注解
  注解使⽤分号表⽰(;)。在分号后⾯的⽂字,直到该⾏结尾都全部为注解。
2、INI⽂件的格式很简单,最基本的三个要素是:sections,parameters和comments。
什么是sections ?
所有的parameters都是以sections为单位结合在⼀起的。所有的section名称都是独占⼀⾏,并且sections名字都被⽅括号包围着([ and ])。在section声明后的所有parameters都是属于该section。对于⼀个section没有明显的结束标志符,⼀个section的开始就是上⼀个section的结束,或者是end of the file。Sections⼀般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。
section如下所⽰:
[section]
什么是parameters?
INI所包含的最基本的“元素”就是parameter;每⼀个parameter都有⼀个name和⼀个value,name和value是由等号“=”隔开。
周立波崔永元name在等号的左边。
例⼦如下:
name = value
什么是comments?佟丽娅演过的电视剧
在INI⽂件中注释语句是以分号“;”开始的。所有的所有的注释语句不管多长都是独占⼀⾏直到结束的,在分号和⾏结束符之间的所有内容都是被忽略的。
注释实例如下:
;comments text
读取配置文件失败
⼆、C/C++读写ini配置⽂件
我们可能经常⽤到配置⽂件ini⽂件来获取或者保存参数信息,在VC中涉及的函数有如下四种谢霆锋否认与杨幂恋情
读写INI⽂件时相对路径和绝对路径都可以,根据实际情况选择
“…\IniFileName.ini” // 这样的为相对路径
“D:\IniFileName.ini” // 这样的为绝对路径
MAX_PATH:是微软最⼤路径占的字节所设的宏
读取配置表
(1)读取字符串(返回值为string的长度(long型),⽽从ini⽂件获得的字符串则保留在⽬的缓冲器中)
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,        // INI⽂件中的⼀个字段名[节名]可以有很多个节名(配置⽂件的section名)
LPCTSTR lpKeyName,        // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名(配置⽂件的key名)
LPCTSTR lpDefault,        // 如果lpReturnedString为空,则把这个变量赋给lpReturnedString
LPTSTR lpReturnedString,  // 存放键值的指针变量,⽤于接收INI⽂件中键值(数据)的接收缓冲区
DWORD nSize,              // lpReturnedString的缓冲区⼤⼩
LPCTSTR lpFileName        // INI⽂件的路径
);
备注:返回值类型为Long,返回值为lpReturnedString缓冲区的字节长度,其中不包括那些NULL中⽌字符。如果lpReturnedString缓冲区不够⼤,不能容下全部信息,就返回nSize-1(若lpApplicationName或lpKeyName为NULL,则返回nSize-2)
(2)读取整型值 (返回值为从ini配置中读到的整数)
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,  // INI⽂件中的⼀个字段名[节名]可以有很多个节名
LPCTSTR lpKeyName,  // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名
INT nDefault,        // 如果没有到指定的数据返回,则把个变量值赋给返回值
LPCTSTR lpFileName  // INI⽂件的路径
);
写⼊配置表
(1)写⼊字符串(返回值类型为Long,⾮零表⽰成功,零表⽰失败。会设置GetLastError)
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,  // INI⽂件中的⼀个字段名[节名]可以有很多个节名
LPCTSTR lpKeyName,  // lpAppName 下的⼀个键名,也就是⾥⾯具体的变量名
LPCTSTR lpString,  // 键值,也就是数据
LPCTSTR lpFileName  // INI⽂件的路径
);
(2)写⼊整数值(没有相关函数,可以通过WritePrivateProfileString进⾏参数转换来实现)
暂⽆
程序实例:
LPTSTR lpPath = new char[MAX_PATH];
strcpy(lpPath, "D:\\IniFileName.ini");
WritePrivateProfileString("LiMing", "Sex", "Man", lpPath); WritePrivateProfileString("LiMing", "Age", "20", lpPath);
WritePrivateProfileString("Fangfang", "Sex", "Woman", lpPath); WritePrivateProfileString("Fangfang", "Age", "21", lpPath);
delete [] lpPath;
INI⽂件如下:
[LiMing]
Sex=Man
Age=20
[Fangfang]
Sex=Woman
Age=21
读INI⽂件:
LPTSTR lpPath = new char[MAX_PATH];
LPTSTR LiMingSex = new char[6];
int LiMingAge;
LPTSTR FangfangSex = new char[6];
int FangfangAge;
strcpy(lpPath, "..\\IniFileName.ini");
黄渤小s好饿完整版GetPrivateProfileString("LiMing", "Sex", "", LiMingSex, 6, lpPath); LiMingAge = GetPrivateProfileInt("LiMing", "Age", 0, lpPath);
GetPrivateProfileString("Fangfang", "Sex", "", FangfangSex, 6, lpPath); FangfangAge = GetPrivateProfileInt("Fangfang", "Age", 0, lpPath);
delete [] lpPath;