ini解析学习文档
一.什么是Ini
ini
文件是Initialization File
的缩写,即初始化文件,通常存放的是一个程序的初始化信息,是Windows
的系统配置文件所采用的存储格式,统管windows
的各项配置。ini
文件的后缀名不一定是.ini
,也可以是.cfg
、.conf
或者是.tx*
。
二.ini文件格式&语法规范
ini
文件由若干个节(section)
组成,每个section
由若干键(Key)
组成,每个Key
可以赋相应的值。读写ini
文件实际上就是读写某个的section
中相应的Key
的值,而这只要借助几个函数即可完成。
-
参数(Parameter)
:ini
文件包含的最基本元素是参数
,参数
包含参数名(name)
和参数值(value)
,格式如下:name=value
-
节(section)
:所有的参数
都是以节
为单位结合在一起。节
名称独占一行,在节声明后的所有的参数
都属于该节
。节
没有结束标识符,一个section
的开始就是上一个section
的结束。格式如下:[section]
-
注释(comments)
:注释
用分号;
表示,放在注释之前,;
号后直到行尾均为注释。示例如下:;i wish nothing but the best for you
-
文件实例
[owner] name=WU yanzu organization=The United Nations [UserConfig] OpenDownloadFileAtOnec=Y WindowStyle=DevExpress Dark Style [Language] Language=CHS [AutoUpdate] Version=2.10 ;last version:2.08
三.系统解析函数
#include <windows.h>
1. 向ini文件中写入信息
- 写入字符串(string)
将信息写入系统的win.ini
文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
例:
::WriteProfileString("owner","name","WU yanzu");
将信息写入自己创建的.ini
文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString, // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
LPCTSTR lpFileName // 要写入的文件的文件名。相对或绝对路径
)
例:
::WritePrivateProfileString("family","name","Liu dehua","D:\GAME\Steam\hhh.ini");
- 写入整数值(int):没有相关函数,可以通过
WriteProfileString
进行参数转换实现
2.从ini文件中读取信息
- 从系统文件
win.ini
中读取信息
读取字符串(string)
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
例:
CString str;
::GetProfileString("owner","name","WU yanzu",str.GetBuffer(20),20);
读取整数(int)
UINT GetProfileInt(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)
例:
int num;
num=::GetProfileInt("record","Phonenumber",19952730031);
- 从自己创建的
.ini
文件中读取信息
读取字符串(string)
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize, // 指定lpReturnedString指向的缓冲区的大小
LPCTSTR lpFileName // 读取信息的文件名。相对路径/绝对路径。
)
例:
CString str;
::GetPrivateProfileString("owner","name","WU yanzu",str.GetBuffer(20),20,"D:\GAME\Steam\hhh.ini");
读取整数(int)
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
LPCTSTR lpFileName // 读取信息的文件名。相对路径/绝对路径。
)
例:
int num;
num=::GetPrivateProfileInt("record","Phonenumber",19952730031,".//dd.ini");
- 读取
.ini
文件中所有Section
:使用GetPrivateProfileSectionNames
函数
DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer, // 指向一个缓冲区,用来保存返回的所有节名
DWORD nSize, // 参数lpszReturnBuffer的大小
LPCTSTR lpFileName // 文件名,相对路径/绝对路径
) //返回所有节名的字节个数(包含结束符'\0')
- 读取
.ini
文件中指定Section
中的所有的key=value
:使用GetPrivateProfileSection
函数
DWORD GetPrivateProfileSection(
LPCTSTR lpAppName, // 节名
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize, // 指定lpReturnedString指向的缓冲区的大小
LPCTSTR lpFileName // 文件名,相对路径/绝对路径
) //返回所有节名的字节个数(包含结束符'\0')
四.系统解析函数读取规则
1. 从遇到的第一个'['开始读,直到遇到第一个']'立即结束读取返回节名
2. 节的'['和']'必须在同一行,即仅对单行读取
3. ';'号后面全部视为注释,节名后面的注释不读取,键值后面的注释会读取
4. 若键值为整形,则只读取键值中第一个非整形字符左侧的整形
5. 忽略'['到第一个字符之间的所有空格,忽略']'到前一个字符之间的所有空格
6. 字符之间的空格不会被忽略,第一个字符到最后一个字符之间的所有内容均视为节名
7. 节可以只有节名没有内容