Windows中读写ini文件
.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,来配置应用软件以实现不同用户的要求。配置文件有很多种如ini配置文件,XML配置文件,系统注册表等。在早期的windows桌面系统中主要是用ini文件作为系统的配置文件,从win95以后开始转向使用注册表,但是还有很多系统配置是使用INI文件的。其实INI文件就是简单的txt文件,只不过这种txt文件要遵循一定的INI文件格式。
ini文件由节、键、值组成:
节
[section] 参数(键=值)
name=value 注解
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
ini文件中可以存在多个小节(Section),每个小节的开始用包括在一对方括号中的小节名称指定,不同的小节不能重名,一个小节的内容从小节名称的下一行开始,直到下一个小节开始为止。用户程序可以按照自己的需求建立多个小节。因为ini文件可能是项目中共用的,所以使用[section]来区分不同用途的参数区。例如:[Section1 Name]表示传感器灵敏度参数区;[Section2 Name]表示测量通道参数区等等。INI所包含的最基本的“元素”就是parameter,每一个parameter都有一个name和一个value,name和value是由等号“=”隔开,name在等号的左边。如:name = value
Windows提供了一系列函数(包含winbase.h或windows.h头文件即可使用)来读写ini文件:
- 将信息写入.INI文件中
BOOL WritePrivateProfileStringA(
LPCSTR lpAppName, // section name
LPCSTR lpKeyName, // key name. If this parameter is NULL, the entire section, including all entries within the section, is deleted.
LPCSTR lpString, // string to add. If this parameter is NULL, the key pointed to by the lpKeyName parameter is deleted.
LPCSTR lpFileName // initialization file
); BOOL WritePrivateProfileSectionW( LPCWSTR lpAppName, LPCWSTR lpString, LPCWSTR lpFileName );
当这些参数全部指定为字符串的时候,函数将在指定INI文件的指定小节中写入“键名=键值”格式的行;当指定的INI文件、文件中的小节和小节中的键名都已经存在的时候,函数用新键值替换原来的键值;当指定的INI文件存在而小节不存在的时候,函数自动创建小节并将键写入;如果连指定的INI文件也不存在的话,函数会自动创建文件。总之,程序不必考虑INI文件是否存在,小节是否存在或键值定义是否存在等情况,只要调用WritePrivateProfileString函数就可以保证配置信息被正确保存。
WritePrivateProfileString函数也可以用来删除键或者小节,当lpAppName和lpKeyName参数指定了小节名称和键名,而lpString参数指定为NULL的时候,函数将指定的键删除。也可以将lpKeyName和lpString参数全部指定为NULL,而lpAppName参数指定小节名称,那么将会删除lpAppName参数指定的小节。
注意如果定义了UNICODE使用的函数实际上为WritePrivateProfileStringW。可以使用_T()宏或TEXT()宏:TEXT() 在定义 UNICODE 情况下使用 UNICODE 字符,否则使用 ANSI 字符。
#ifdef UNICODE
#define WritePrivateProfileString WritePrivateProfileStringW
#else
#define WritePrivateProfileString WritePrivateProfileStringA
#endif // !UNICODE
- 将信息从INI文件中读入程序中的变量
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // If this parameter is NULL, the GetPrivateProfileString function copies all section names in the file to the supplied buffer.
LPCTSTR lpKeyName, // If this parameter is NULL, all key names in the section specified by the lpAppNameparameter are copied to the buffer specified by the lpReturnedString parameter.
LPCTSTR lpDefault, // If the lpKeyName key cannot be found in the initialization file, GetPrivateProfileString copies the default string to the lpReturnedString buffer.
LPTSTR lpReturnedString, // destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // The name of the initialization file
);
函数的返回值是返回到缓冲区中的字符串长度。lpReturnedString参数指向一个缓冲区,函数在这里返回获取的键值字符串,缓冲区的长度用nSize参数指定,当缓冲区的长度太小以至于无法容纳返回的字符串时,字符串会被截止到nSize-1的长度后返回,余下的一个字节用来存放一个a null character(0字符:'\0')做结尾。lpDefault参数指向一个默认字符串,当指定的键无法找到的时候,函数将这个字符串拷贝到返回缓冲区中。
GetPrivateProfileString还有两种特殊用法:
(1)当lpAppName参数指定为NULL的时候,函数在缓冲区中返回的是全部小节名称的列表,每个小节名以0结尾,全部的名称列表再以一个附加的0结束,返回到缓冲区中的数据格式如下所示:
小节名称1,0,小节名称2,0,…,小节名称n,0,0
(2)当lpAppName参数指定了小节名称,而lpKeyName参数指定为NULL的时候,函数在缓冲区中返回该小节的全部键名列表,每个键名以0结尾,全部列表后面再以一个附加的0结束,如下所示:
键名1,0,键名2,0,…,键名n,0,0
因此可以用这两种方式来枚举INI文件中的节名以及各个节中的键名。
下面代码在VS项目目录中创建了一个test.ini的文件:
#include <windows.h> int main()
{
WritePrivateProfileString(TEXT("Section1"),
TEXT("FirstKey"),
TEXT("Value1"),
TEXT(".\\test.ini")); WritePrivateProfileString(TEXT("Section1"),
TEXT("SecondKey"),
TEXT("Value2"),
TEXT(".\\test.ini")); // Test
TCHAR inBuf[];
int ret = GetPrivateProfileString(TEXT("Section1"),
TEXT("FirstKey"),
TEXT("Error: failed"),
inBuf,
,
TEXT(".\\test.ini"));
_tprintf(TEXT("Key: %s\n"), inBuf); return ;
}
test.ini文件内容如下:
[Section1]
FirstKey=Value1
SecondKey=Value2
GetPrivateProfileString函数获取FirstKey的值Value后将其打印在屏幕上,输出为:
Key: Value1
如果将接收数组长度改为3,可以看到结果被截断,GetPrivateProfileString函数返回值为3-1=2:
当lpKeyName参数指定为NULL的时候,函数在缓冲区中返回该小节的全部键名列表:
当lpAppName参数指定为NULL的时候,函数在缓冲区中返回的是全部小节名称的列表:
如果key的值为整数,那么还可以使用GetPrivateProfileInt函数来读取。该函数返回键值对应的整数
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault, //The default value to return if the key name cannot be found in the initialization file.
LPCTSTR lpFileName
);
比如下面的ini文件,可以用GetPrivateProfileInt函数获取Section2中AnotherKey的值,将返回整型数字2。如果获取其它section中的键值将返回默认值。
[Section1]
FirstKey=Value1
SecondKey=Value2
[Section2]
AnotherKey=2
代码如下:
#include <windows.h> int main()
{ WritePrivateProfileString(TEXT("Section1"),
TEXT("FirstKey"),
TEXT("Value1"),
TEXT(".\\test.ini")); WritePrivateProfileString(TEXT("Section1"),
TEXT("SecondKey"),
TEXT("Value2"),
TEXT(".\\test.ini")); WritePrivateProfileString(TEXT("Section2"),
TEXT("AnotherKey"),
TEXT(""),
TEXT(".\\test.ini")); // Test
TCHAR inBuf[];
int ret = GetPrivateProfileString(TEXT("Section1"),
TEXT("FirstKey"),
TEXT("Error: failed"),
inBuf,
,
TEXT(".\\test.ini"));
_tprintf(TEXT("Key: %s\n"), inBuf); // Get keys in section1
GetPrivateProfileString(TEXT("Section1"), NULL, TEXT("Error: failed"), inBuf, , TEXT(".\\test.ini")); // Retrieves an integer associated with a key in the specified section of an initialization file.
UINT i = GetPrivateProfileInt(TEXT("Section2"), TEXT("AnotherKey"), , TEXT(".\\test.ini"));
printf("integer value: %d", i); return ;
}
参考:
UNICODE VS _UNICODE 与 TEXT() VS _T()
Windows中读写ini文件的更多相关文章
- 如何在C#中读写INI文件
INI文件就是扩展名为"ini"的文件.在Windows系统中,INI文件是很多,最重要的就是"System.ini"."System32.ini&q ...
- C#中读写INI文件
C#中读写INI文件 c#的类没有直接提供对ini文件的操作支持,可以自己包装win api的WritePrivateProfileString和GetPrivateProfileString函数实现 ...
- C#中读写INI文件
INI文件就是扩展名为“ini”的文件.在Windows系统中,INI文件是很多,最重要的就是“System.ini”.“System32.ini”和“Win.ini”.该文件主要存放用户所做的选择以 ...
- C#在winform中读写ini文件
class WY_INI { static string IniFileName; static char[] TrimChar = { ' ', '\t' }; public string[] Ge ...
- C++ Windows API 读写INI文件
BOOL WritePrivateProfileString( LPCTSTR lpAppName, // INI文件中的一个字段名[节名]可以有很多个节名 LPCTSTR lpKeyName, // ...
- WIN32读写INI文件方法
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ...
- 读写ini文件
C# 使用文件流来读写ini文件 背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI ...
- 在 WinCe 平台读写 ini 文件
在上篇文章开发 windows mobile 上的今日插件时,我发现 wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数.在网络上我并没有找到令我满意的 ...
- Qt读写ini文件
一 背景 1 ini文件介绍 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现 ...
随机推荐
- 068 mapWithState函数的讲解
1.问题 主要是updateStateByKey的问题 有的值不需要变化的时候,还会再打印出来. 每个批次的数据都会出现,如果向redis保存更新的时候,会把不需要变化的值也更新,这个不是我们需要的, ...
- 左连接不能与or否则in连用
select z.sjssny,z.XXSE,z.JXSE,z.nsrsbh, nsr.zgswskfj_dm,nsr.nsrmc,nsr.zgswj_dm,nsr.SSGLY_DM,nsr.nsr ...
- Debian 9 VIM 使用鼠标右键复制
起因 装了 debian 9 以后,vim没有办法使用鼠标直接选择并复制,后来发现是默认的配置问题.于是需要按照以下方式解决: 解决方法 1. 编辑 vim 的默认配置文件 vim /usr/shar ...
- window下配置SSH连接GitHub、GitHub配置ssh key
window下配置SSH连接GitHub.GitHub配置ssh key 此经验分两部分: 第一部分介绍:在windows下通过msysGit(Git for windows.Git Bash)配 ...
- appium-电脑连不上手机设备如何解决
在自动化过程中,会遇到电脑无法连接到手机情况,首先在cmd命令输入adb devices查看是否报错,报错绝大可能是5037端口被占用了,因为adb默认绑定的是5037端口 1.查看占用端口的进程PI ...
- 笔记-JS高级程序设计-变量,作用域和内存问题
1在将一个值赋给变量时,解析器必须确认这个值是基本类值还是引用类型值,基本类型值是按值访问的,可以操作保存在在变量中的实际值,引用类型是保 存在内存中的对象,JS不允许直接访问内存中的位置,所以实际操 ...
- js基础梳理-如何理解作用域和作用域链?
本文重点是要梳理执行上下文的生命周期中的建立作用域链,在此之前,先回顾下关于作用域的一些知识. 1.什么是作用域(scope)? 在<JavaScritp高级程序设计>中并没有找到确切的关 ...
- jarvis OJ WEB题目writeup
0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...
- 排列组合 HDU - 1521 -指数型母函数
排列组合 HDU - 1521 一句话区分指数型母函数和母函数就是 母函数是组合数,指数型母函数是排列数 #include<bits/stdc++.h> using namespace s ...
- ps选区的两种复制方法
1.选区选中之后,利用移动工具,按住alt键,拖动即可复制所选区域. ps:再一个图层上操作. 2.选区选中之后,Ctrl+c .Ctrl+v复制粘贴,按Ctrl+T移动. ps:新建一个图层操作,不 ...