INI 文件的操作

在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 ini 文件(Profile)来保存少量数据。本文中先介绍一下 .ini 文件的使用。 

ini 文件是文本文件,中间的数据格式一般为: 
[Section1 Name] 
KeyName1=value1 
KeyName2=value2 
... 

[Section2 Name] 
KeyName1=value1 
KeyName2=value2 

ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 api,它们是: 

GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值,它的原形是: 

GetProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少 
); 

如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234 


GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串,它的原形是: 

GetProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址 
LPTSTR lpReturnedString, // 返回字符串的缓冲区地址 
DWORD nSize // 缓冲区的长度 
); 

返回的字符串在缓冲区内,返回的 eax 值是返回的字符串的长度(不包括尾部的0) 


GetProfileSection - 从 Win.ini 文件中读出整个 Section 的内容,它的原形是: 

GetProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPTSTR lpReturnedString, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
); 


WriteProfileSection - 将一个整个 Section 的值 写入 Win.ini 文件的指定 Section 中,它的原形是: 

WriteProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpString // 要写入的数据的地址 
); 

如果 Win.ini 没有指定的 Section,API 会新建立一个并写入数据,如果已经存在,则先删除原来 Seciton 中所有的 Key 值然后写入新的。 


WriteProfileString - 将一个 Key 值写入 Win.ini 文件的指定 Section 中,它的原形是: 

WriteProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpString // 要写的字符串地址 
); 

如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。 
以上的 Api 是对 Win.ini 操作的,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的 ini 文件,如果需要对自己的 ini 文件操作,就要用到另一组 Api,这一组 api 和上面的很象,只要把上面一组的 Profile 换成 PrivateProfile(私有的)就可以了,参数中也相应的多了一个 ini 文件名的参数。例如 GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString 等等, 下面分别介绍: 

GetPrivateProfileInt - 从 ini 文件的某个 Section 取得一个 key 的整数值,它的原形是: 

GetPrivateProfileInt( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
INT nDefault // 如果 Key 值没有找到,则返回缺省的值是多少 
LPCTSTR lpFileName // ini 文件的文件名 
); 

中间参数和返回值的定义和 GetProfileInt 是一样的。 


GetPrivateProfileString - 从 ini 文件的某个 Section 取得一个 key 的字符串,它的原形是: 

GetPrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址 
LPTSTR lpReturnedString, // 返回字符串的缓冲区地址 
DWORD nSize // 缓冲区的长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 


GetPrivateProfileSection - 从 ini 文件中读出整个 Section 的内容,它的原形是: 

GetPrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPTSTR lpReturnedString, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 

这个 api 可以读出整个 section 的内容,当你不知道 section 中有哪些 key 的时候,可以使用这个 api 将整个 section 读出后再处理。 


GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称,它的原形是: 

GetPrivateProfileSectionNames( 
LPTSTR lpszReturnBuffer, // 返回数据的缓冲区地址 
DWORD nSize // 返回数据的缓冲区长度 
LPCTSTR lpFileName // ini 文件的文件名 
); 

如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0 ,当你不知道 ini 中有哪些 section 的时候可以用这个 api 来获取名称 


WritePrivateProfileSection - 将一个整个 Section 的内容入 ini 文件的指定 Section 中,它的原形是: 

WritePrivateProfileSection( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpString // 要写入的数据的地址 
LPCTSTR lpFileName // ini 文件的文件名 
); 


WritePrivateProfileString - 将一个 Key 值写入 ini 文件的指定 Section 中,它的原形是: 

WritePrivateProfileString( 
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址 
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址 
LPCTSTR lpString // 要写的字符串地址 
LPCTSTR lpFileName // ini 文件的文件名 
); 

如果 ini 中没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。当指定的 ini 也不存在的时候,API 会自动建立一个新的文件,所以使用 ini 的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。 

使用要点: 

在我们实际使用的时候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在对自定义 ini 文件操作的时候要注意的是,如果 lpFileName 指定的文件没有路径的话,Api 会去 Windows 的安装目录去找而不会在当前目录找,但是每次用到 ini 函数要获取当前路径显然太麻烦了,这里有一个变通的办法,你只要在 ini 文件名前面加上 .\ 就可以了,比如说要对本目录下的 user.ini 操作,那么文件名就是 '.\user.ini' 这样显然比较方便。另外,当你要把一个 Key 清除的时候,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileString。当你要把一个 section 的全部内容清空的时候,也不必把 key 一个个的清除,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileSection。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

摩拜大数据杀熟?官方:老用户押金的确退款延迟

近日,有媒体曝出摩拜单车一些老用户出现押金难退现象。有的消费者点击退款后,系统不断奔溃;有的申请退款后,账户又莫名出现押金,就像未申请一样;也有人终于提交了退款,等候数日却迟迟不见到账。…

Junit Test使用样例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 配置: 调用类: import java.util.List;import javax.annotation.Resource;import org.apache.shiro.crypto.Rand…

Django congtent types应用

contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中。 每当我们创建了新的model并执行数据库迁移后,ContentType表中就会自动新增一条记录。比如我在应用app01的models.py中创建表class E…

网络爬虫--7.Handler处理器 和 自定义Opener

文章目录一. 引言二. 简单的自定义opener()三. ProxyHandler处理器(代理设置)四. Cookie1.Cookie原理2.Cookie应用五. cookiejar库 和 HTTPCookieProcessor处理器1.案例一:获取Cookie,并保存到CookieJar()对象中2.案例二:利用cook…

如何选择面向对象语言

开发人员在选择面向对象语言时,还应该着重考虑以下一些实际因素。 1. 将来能否占主导地位 为了使自己的产品在若干年后仍然具有很强的生命力,人们可能希望采用将来占主导地位的语言编程。 根据目前占有的市场份额,以及专业书刊和学术会议上所…

Unicode编码及其实现:UTF-16、UTF-8,and more

本文主要讨论Unicode的编码与各种实现,着重讨论UTF-16,UTF-8的实现规则,以及Big-endian和Little-Endian的存储规则。 一、Unicode编码 Unicode出现之前已经有各种编码标准:ANSI、ISO8859-1、GB2312、GBK以及BIG-5等。Unicode试图统…

Apache Tiles的使用 前配置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用方法见&#xff1a; http://blog.csdn.net/jiangyu1013/article/details/53161580 1.加maven 依赖&#xff1a; <!-- 页面布局…

day212223:线程、进程、协程

1、程序工作原理 进程的限制&#xff1a;每一个时刻只能有一个线程来工作。多进程的优点&#xff1a;同时利用多个cpu&#xff0c;能够同时进行多个操作。缺点&#xff1a;对内存消耗比较高当进程数多于cpu数量的时候会导致不能被调用&#xff0c;进程不是越多越好&#xff0c;…

php课程 8-28 php如何绘制生成显示图片

php课程 8-28 php如何绘制生成显示图片 一、总结 一句话总结&#xff1a;gd库轻松解决 1、php图片操作生成的图的两种去向是什么&#xff1f; 一种在页面直接输出&#xff0c;一种存进本地磁盘 2、php操作图片的库有哪些&#xff1f; PHP: Image Processing and Generation - M…

代码行技术

用代码行技术估算软件规模时&#xff0c;当程序较小时常用的单位是代码行数&#xff08;LOC&#xff09;&#xff0c;当程序较大时常用的单位是千行代码数&#xff08;KLOC&#xff09;。 代码行技术的主要优点是&#xff0c;代码是所有软件开发项目都有的“产品”&#xff0c;…

网络爬虫--8.编码趣闻

很久很久以前&#xff0c;有一群人&#xff0c;他们决定用8个可以开合的晶体管来组合成不同的状态&#xff0c;以表示世界上的万物。他们看到8个开关状态是好的&#xff0c;于是他们把这称为"字节"。 再后来&#xff0c;他们又做了一些可以处理这些字节的机器&#…

科技领域的一分钟

各位果迷是否能想象在一分钟之内&#xff0c;科技领域都会发生什么事情&#xff1f;——苹果平均每分钟卖出81部 iPad&#xff1b;在 iPhone 4S 发布后的第一个周末&#xff0c;每分钟卖出925部 iPhone 4S&#xff1b;RIM每分钟卖出103台黑莓手机&#xff1b;Amazon每分钟卖出1…

flavr—超级漂亮的jQuery扁平弹出对话框

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 插件描述&#xff1a;flavr是一个时尚的扁平弹出对话框为您的下一个网站。 flavr是响应设计布局&#xff0c;能够适应任何屏幕大小。 得…

经纬度之间的距离计算

来自谷歌地图的计算公式&#xff1a; 通过JAVA的Math类各种方法调用。实现上述公式 private static double EARTH_RADIUS 6378.137;// 单位千米/*** 角度弧度计算公式 rad:(). <br/>* * 360度2π πMath.PI* * x度 x*π/360 弧度* * author chiwei* param d* return* s…

在CentOS7阿里云服务器部署ThinkPHP5,并配置phpstrom实现同步开发(微信小程序及管理员后端)...

小程序和后端同步开发 1.服务器安装tp5框架&#xff1a; 方法很多比如&#xff1a;github、linux命令直接手动下、composer 都可以&#xff0c;方法很多&#xff0c;百度一下&#xff0c;不再累述 2.这时你会发现怎么都访问出现不了这个令人舒心的界面&#xff08;ok第一个坑到…

ER图( 实体联系图)

E-R图也称实体-联系图(Entity Relationship Diagram)&#xff0c;提供了表示实体类型、属性和联系的方法&#xff0c;用来描述现实世界的概念模型。 它是描述现实世界概念结构模型的有效方法。是表示概念模型的一种方式&#xff0c;用矩形表示实体型&#xff0c;矩形框内写明…

网络爬虫--9.正则表达式

文章目录一. 正则表达式1.为什么要学正则表达式2.什么是正则表达式3.正则表达式匹配规则二. Python 的 re 模块1.re 模块的一般使用步骤2.compile 函数3.match 方法4.search 方法5.findall 方法6.finditer 方法7.split 方法8.sub 方法9.匹配中文10.贪婪模式与非贪婪模式1&#…

概念模型

将需求分析得到的用户需求抽象为信息结构&#xff08;即概念模型&#xff09;的过程就是概念结构设计 概念模型的特点 &#xff08;1&#xff09;能真实、充分地反映现实世界&#xff0c;是现实世界的一个真 实模型。 &#xff08;2&#xff09;易于理解&#xff0c;从…

笔记本电池的正确使用方法

一、新买笔记本不需要激活&#xff0c;也不需要前三次的充电12小时深充深放&#xff0c;这主要是锂电池的原理和特性决定的。电池设计有电量保护&#xff0c;不可能将电量完全用完&#xff0c;当然也不可能过度充电。 二、笔记本电池的寿命受周围环境的影响很大&#xff0c;最好…

关于XShell 启动虚拟机的weblogic并在本地打开oracle-weblogic 有关部署

对于没有用过这款软件的童鞋&#xff0c;我想必定会有几步弯路&#xff1a; 1.新建好的虚拟机记得换成root用户【su root】~ifconfig【eth0 inet addr】如果没有这项请点击右上角的电脑标识&#xff0c;鼠标左击一下连接&#xff0c;没有了x号就重新输入ifconfig就有了 2.xshe…