目录
一、INI的结构和用途
.ini 文件是Initialization File的缩写,初始化文件,配置文件所采用的存储格式,用来配置应用软件以实现不同用户的要求。
1.1 格式
INI文件由节、键、值组成;节用于分类分段的,键值对就是具体配置项了。
- 节形式 [section],一般节名通常是调用应用程序的名称或应用分模块的名称。
- 参数形式(键=值)name=value
- 注解/注释 使用分号表示(;),为单行注释
在分号后面的文字,直到该行结尾都全部为注解。
; comment text
1.2 INI文件示例
[Section1 Name]
KeyName1=value1
KeyName2=value2
...
[Section2 Name]
KeyName21=value21
KeyName22=value22
其中:
[Section1 Name]用来表示一个段落。
因为INI文件可能是项目中共用的,所以使用[Section Name]段名来区分不同应用或不同模块或不同用途的参数区。
例如:
[Section1 Name]表示传感器灵敏度参数区;
[Section2 Name]表示测量通道参数区等等。
KeyName1=value1 用来表示一个参数名和值。
1.3 实例
; exp ini file
[port]
portname=COM4
port=4
二、怎么写入一个节Section
- WritePrivateProfileSectionA/WritePrivateProfileSectionW
函数形式如下
BOOL WritePrivateProfileSectionA(
[in] LPCSTR lpAppName, //=SectionName
[in] LPCSTR lpString,
[in] LPCSTR lpFileName
);
BOOL WritePrivateProfileSectionW(
[in] LPCWSTR lpAppName, //=SectionName
[in] LPCWSTR lpString,
[in] LPCWSTR lpFileName
);
参数如下
[in] lpAppName 写入数据的节名。 一般节名称通常是调用应用程序的名称或应用分模块的名称。
[in] lpString 要写入命名节的新键名称和关联的值。 此字符串限制为 65,535 字节。lpString 每个字符串采用固定形式:键名=键值字符串
[in] lpFileName ini文件的名称。 如果此参数不包含文件的完整路径,该函数将在 Windows 目录中搜索该文件。 如果文件不存在且 lpFileName 不包含完整路径,该函数将在 Windows 目录中创建该文件。
如果文件存在并使用 Unicode 字符创建,函数会将 Unicode 字符写入文件。 否则,该函数使用 ANSI 字符创建文件。
返回值 如果该函数成功,则返回值为非零值。如果函数失败,则返回值为零。
三、怎么读/写键值对
3.1、读/写String
- GetPrivateProfileString/WritePrivateProfileString(根据设置自适应,推荐)
- GetPrivateProfileStringA /WritePrivateProfileStringA (ASCII/MBCS)
- GetPrivateProfileStrinW /WritePrivateProfileStrinW (宽字符集)
他们的函数形式如下:
DWORD GetPrivateProfileStringA(
[in] LPCTSTR lpAppName, // =SectionName
[in] LPCTSTR lpKeyName,
[in] LPCTSTR lpDefault,
[out] LPTSTR lpReturnedString,
[in] DWORD nSize,
[in] LPCTSTR lpFileName
);
DWORD GetPrivateProfileStringW(
[in] LPCWSTR lpAppName, // =SectionName
[in] LPCWSTR lpKeyName,
[in] LPCWSTR lpDefault,
[out] LPWSTR lpReturnedString,
[in] DWORD nSize,
[in] LPCWSTR lpFileName
);
参数说明:
[in] lpAppName 包含节的名称,即SectionName。 如果此参数为 NULL, GetPrivateProfileString 函数会将文件中的所有节名称复制到提供的缓冲区。
[in] lpKeyName 要检索其关联字符串的键的名称。 如果此参数为 NULL,则将 lpAppName 参数指定的节中的所有键名称复制到 lpReturnedString 参数指定的缓冲区。
[in] lpDefault 默认/缺省字符串。 如果在初始化文件中找不到 lpKeyName , GetPrivateProfileString 会将默认字符串复制到 lpReturnedString 缓冲区。
如果此参数为 NULL,则默认值为空字符串“”。
避免使用尾随空白字符指定默认字符串。 该函数在 lpReturnedString 缓冲区中插入 null 字符以去除任何尾随空白。
[out] lpReturnedString 指向接收检索字符串的缓冲区的指针。
[in] nSize lpReturnedString 参数指向的缓冲区的大小(以字符为单位)。
[in] lpFileName 初始化文件的名称。一般推荐使用完整路径。 如果此参数不包含文件的完整路径,系统将在 Windows 目录中搜索该文件。
返回值 返回值是复制到缓冲区的字符数,不包括终止 null 字符。
如果 lpAppName 和 lpKeyName 都不是 NULL ,并且提供的目标缓冲区太小,无法保存请求的字符串,则字符串将被截断,后跟 null 字符,并且返回值等于 nSize 减一。
如果 lpAppName 或 lpKeyName 为 NULL ,并且提供的目标缓冲区太小,无法容纳所有字符串,则最后一个字符串将被截断,后跟两个 null 字符。 在这种情况下,返回值等于 nSize 减 2。
BOOL WritePrivateProfileStringA(
[in] LPCSTR lpAppName,// =SectionName
[in] LPCSTR lpKeyName,
[in] LPCSTR lpString,
[in] LPCSTR lpFileName
);
BOOL WritePrivateProfileStringW(
[in] LPCWSTR lpAppName,// =SectionName
[in] LPCWSTR lpKeyName,
[in] LPCWSTR lpString,
[in] LPCWSTR lpFileName
);
参数说明:
[in] lpAppName 节的名称。 如果节不存在,则会创建一个。 节的名称与大小写无关;字符串可以是大写字母和小写字母的任意组合。
[in] lpKeyName 键名, 如果指定节中不存在该键,则会创建它。 如果此参数为 NULL,则会删除整个节(包括该节中的所有条目)。
[in] lpString 要写入文件的 以 null 结尾的字符串。 如果此参数为 NULL,则删除 lpKeyName 参数指向的键。
[in] lpFileName ini文件的名称。
如果文件是使用 Unicode 字符创建的,函数会将 Unicode 字符写入文件。 否则,该函数将写入 ANSI 字符。
如果 lpFileName 参数不包含文件的完整路径和文件名, WritePrivateProfileString 会在 Windows 目录中搜索该文件。 如果文件不存在,此函数将在 Windows 目录中创建该文件。
如果 lpFileName 包含完整路径和文件名,并且该文件不存在, 则 WritePrivateProfileString 将创建该文件。 指定的目录必须已存在。
返回值 如果函数成功将字符串复制到初始化文件,则返回值为非零值。
3.2、读/写Int
- GetPrivateProfileInt
- GetPrivateProfileIntA
- GetPrivateProfileInW
形式如下
UINT GetPrivateProfileInt(
[in] LPCTSTR lpAppName,
[in] LPCTSTR lpKeyName,
[in] INT nDefault,
[in] LPCTSTR lpFileName
);
UINT GetPrivateProfileIntA(
[in] LPCSTR lpAppName,
[in] LPCSTR lpKeyName,
[in] INT nDefault,
[in] LPCSTR lpFileName
);
UINT GetPrivateProfileIntW(
[in] LPCWSTR lpAppName,
[in] LPCWSTR lpKeyName,
[in] INT nDefault,
[in] LPCWSTR lpFileName
);
参数解释同上面完全一致,不再过重复赘述。
3.3、读/写结构体
有许多人在ini文件的键值对中看到很长一段稀奇古怪的类似:64R56DDBBBB0099AS99887YUYB0099AS99887YUYTT55...毫无规律的密文。其实这就是结构体了,只是微软接口换了一种编码形式进行存取结构体而已。
形式:
键名=结构体编码密文字符串
主要用到下面两组函数:
- WritePrivateProfileStruct/WritePrivateProfileStructA/WritePrivateProfileStructW
- GetPrivateProfileStruct/GetPrivateProfileStructA/GetPrivateProfileStructW
函数形式
BOOL GetPrivateProfileStructA(
[in] LPCSTR lpszSection,
[in] LPCSTR lpszKey,
[out] LPVOID lpStruct,
[in] UINT uSizeStruct,
[in] LPCSTR szFile
);
BOOL GetPrivateProfileStructW(
[in] LPCWSTR lpszSection,
[in] LPCWSTR lpszKey,
[out] LPVOID lpStruct,
[in] UINT uSizeStruct,
[in] LPCWSTR szFile
);
BOOL WritePrivateProfileStructA(
[in] LPCSTR lpszSection,
[in] LPCSTR lpszKey,
[in] LPVOID lpStruct,
[in] UINT uSizeStruct,
[in] LPCSTR szFile
);
BOOL WritePrivateProfileStructW(
[in] LPCWSTR lpszSection,
[in] LPCWSTR lpszKey,
[in] LPVOID lpStruct,
[in] UINT uSizeStruct,
[in] LPCWSTR szFile
);
[in] lpszSection
ini文件中节的名称。
[in] lpszKey
要搜索的键名。
[out] lpStruct
指向接收与文件、节和键名称关联的数据的缓冲区的指针。注意这里用你自己定义好你的结构体缓冲,这样写入或读取的字段就是一一对应的。
[in] uSizeStruct
lpStruct 参数指向的缓冲区的大小(以字节为单位)。
[in] szFile
初始化文件的名称。 如果此参数不包含文件的完整路径,系统将在 Windows 目录中搜索该文件。
返回值
如果该函数成功,则返回值为非零值。如果函数失败,则返回值为零。
四、遍历所有节
主要用该函数:
- GetPrivateProfileSectionNames遍历出该INI文件下的所有节
形式如下:
DWORD GetPrivateProfileSectionNames(
[out] LPTSTR lpszReturnBuffer,
[in] DWORD nSize,
[in] LPCTSTR lpFileName
);
参数解释:
[out] lpszReturnBuffer
指向用于接收与本ini文件关联的所有节名称的缓冲区指针。当你不知道缓冲区申请多大时,建议看下INI文件每个节,统计一下字节数。最无脑又直接的办法就是申请足够大。
[in] nSize lpszReturnBuffer 参数指向的缓冲区的大小(以字符为单位)。
[in] lpFileName 初始化文件的名称。一般指定完整文件路径。 如果此参数为 NULL,则该函数将搜索Win.ini文件。 如果此参数不包含文件的完整路径,系统将在 Windows 目录中搜索该文件。
返回值
返回值指定复制到指定缓冲区的字符数,不包括终止 null 字符。 如果缓冲区不够大,无法包含与指定初始化文件关联的所有节名称,则返回值等于 nSize 减 2 指定的大小。
五、遍历节内所有键值对
主要用该函数
- GetPrivateProfileSection 遍历出SECTION下的所有键值对
形式如下:
DWORD GetPrivateProfileSection(
[in] LPCTSTR lpAppName,//SectionName
[out] LPTSTR lpReturnedString,
[in] DWORD nSize,
[in] LPCTSTR lpFileName
);
参数:
[in] lpAppName 该ini文件中节名称。不区分大小写,可以是大写字母和小写字母的组合
[out] lpReturnedString 指向接收与命名节关联的键名称和值对的缓冲区的指针。
形式:键名=字符串\0键名=字符串\0键名=字符串\0键名=字符串\0键名=字符串\0
此操作是原子操作;当节的键值对复制到 lpReturnedString 参数指向的缓冲区时,不允许对指定的初始化文件进行更新。
[in] nSize 是lpReturnedString 参数指向的缓冲区的大小(以字符为单位)。最大配置文件节大小为 32,767 个字符。
[in] lpFileName INI文件的名称。推荐完整路径。 如果此参数不包含文件的完整路径,系统将在 Windows 目录中搜索该文件。
返回值
返回值指定复制到缓冲区的字符数,不包括终止 null 字符。 如果缓冲区不够大,无法包含与命名节关联的所有键名称和值对,则返回值等于 nSize 减 2。
lpReturnedString 参数指向的缓冲区中的数据由一个或多个以 null 结尾的字符串组成,后跟最终的 null 字符。 每个字符串具有以下格式:
搁笔。如果遇到有什么疑问,可留言或站内私信消息。