Win32:INI文件读写结构体/Int/String/遍历

18 篇文章 0 订阅
3 篇文章 0 订阅

目录

一、INI的结构和用途

1.1 格式

1.2 INI文件示例

1.3 实例

二、怎么写入一个节Section

三、怎么读/写键值对

3.1、读/写String

3.2、读/写Int

3.3、读/写结构体

四、遍历所有节

五、遍历节内所有键值对


一、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 字符。 每个字符串具有以下格式:

搁笔。如果遇到有什么疑问,可留言或站内私信消息。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌志辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值