本篇文章1790字,读完约4分钟
ini文件是扩展名为“ini”的文件。 在windows系统中,ini文件很多,最重要的是“system.ini”、“system32.ini”和“win.ini”。 此文件首先存储您所做的选择以及系统的各种参数。 客户可以通过修改ini文件来更改APP和系统的许多配置。 但是,自从windows 95结束,并在windows系统中引入了注册表概念之后,ini文件在windows系统中的地位开始下降。 这是因为注册表的独特优势,APP和系统将多个参数和初始化新闻放在注册表中。 但在某些情况下,ini文件具有不可替代的地位。
ini文件结构
ini文件是以优势方式排列的拷贝文件。 每个ini文件的结构非常相似,由几个段落section组成。 在每个带括号的标题下,有几个以一个单词开头的关键字keyword和等号,等号的右侧有与关键字相对应的值value。 的一般形式如下
第1节
关键字1 =值1
关键字2 =值2
……
第2节关键字3 =值3
关键字4 =值4
ini文件,即初始化文件。 这种类型的文件一般存储程序初始化新闻。 ini文件由几个部分( section )组成,每个部分由几个键( key )组成,并且可以为每个键指定对应的值。 读写ini文件实际上是读写某个section中对应的key的值,这只要利用几个函数就可以。
一、向ini文件写入新闻的函数
1 .将新闻写入系统的win.ini文件
使用布尔writeprofilestring (
lpctstr lpappname,//子句的名称是以0结尾的字符串
lpctstr lpkeyname,//键的名称是以0结尾的字符串。 如果为null,则删除整个部分
lpctstr lpstring //键的值是以0结尾的字符串。 如果为null,则删除对应的密钥
)
2 .将新闻写入自己定义的. ini文件
使用布尔writeprivateprofilestring (
lpctstr lpappname,//同上
LC TSTR LP键名,//同上
lpctstr LP字符串,//同上
lpctstr lpfilename //要写入的文件的文件名。 如果该ini文件与程序位于同一目录中,则也可以采用相对
//传球,否则有必要打出绝招。
)
例如:
: writeprofilestring ( (测试,标识,xym );
在win.ini中创建test部分,在该部分中创建密钥id。 值为xym
:写入专用配置文件(测试、id、xym、d:\VC\ex1\ex1.ini );
在//ex1目录下的ex1.ini中创建test部分,并在该部分中创建密钥id。 值为xym
如果ex1.ini文件与用于读写该文件的程序位于同一目录中,则也可以按如下方式编写上述语句:
: writeprivateprofilestring (测试,id,xym,.\ex1.ini );
需要注意的是,c系列语言中的转义字符'; ()\'; 反斜线'; () ) 39; 。 另外,采用相对路径时,\前面的.符号不能丢弃。
二、从ini文件读取数据的函数
1、从系统的win.ini文件中读取新闻
(1)读取字符串
dword getprofilestring (
lpctstr lpappname,//节名
读取lpctstr LP密钥名称,//密钥名称及其值
如果不存在lpctstr lpdefault,//指定的密钥,则该值为读取默认值
通过指向lptstr lpreturnedstring,//缓冲区的指针,接收读取的字符串
指定dwordnsize//lpreturnedstring所指向的缓冲区的大小
)
例如:
字串星;
: getprofilestring (测试,标识,错误,str.getbuffer(20 ),20 );
)2)读取整数
uint getprofileint (
lpctstr lpappname,//同上
LC TSTR LP键名,//同上
int ndefault //如果指定的密钥名不存在,则该值为读取的默认值
)
如果使用以下句子写年龄新闻:
: writeprofilestring (测试,age,25 );
在win.ini中创建test部分,在该部分中创建密钥age。 值为25
可以在以下语句中读取age密钥的值。
int age;
age =:getprofileint (测试,age,0 );
2、从自己的ini文件中读取新闻
(1)读取字符串
使用dword getprivateprofilestring (
lpctstr lpappname,//同上1(1) )。
LPC TSTR LP键名,//同上1(1) )。
lpctstr LP默认值,//同上1(1) )。
lptstr lpreturnedstring,//同1(1) )。
dword nsize,//同1(1) )。
读取lpctstr lpfilename //新闻的文件名。 如果此ini文件与程序位于同一目录中,则还可以采用阶段
//对于传球,否则有必要打出绝对的传球。
)
例如:
字串星;
: getprivateprofilestring (测试、标识、错误、str.getbuffer ) 20,.
或者:
: getprivateprofilestring (测试,标识,错误,str.getbuffer ( 20,20,d:\ VC ( ex1.ini ) );
)2)读取整数
uint getprivateprofileint (
lpctstr lpappname,//同上
LC TSTR LP键名,//同上
int ndefault,//如果指定的密钥名不存在,则该值为读取的默认值
lpctstr lpfilename //同上
)
如果使用以下句子写年龄新闻:
: writeprivateprofilestring (测试,age,25,.\ex1.ini );
在ex1.ini中创建测试部分,在该部分中创建密钥age。 值为25
可以在以下语句中读取age密钥的值。
int age;
age =:getprivateprofileint (测试,age,0,.\ex1.ini );
三、删除键值或部分
回顾writeprofilestring函数的证明
使用布尔writeprofilestring (
lpctstr lpappname,//子句的名称是以0结尾的字符串
lpctstr lpkeyname,//键的名称是以0结尾的字符串。 如果为null,则删除整个部分
lpctstr lpstring //键的值是以0结尾的字符串。 如果为null,则删除对应的密钥
)
由此可见,要删除节,只需将writeprofilestring的第二个参数设置为null即可。 要删除密钥,只需将函数的第三个参数设置为null。 这是从系统的win.ini中删除一个部分或密钥。 同样,从自己定义的ini文件中删除节或键时也可以执行同样的操作。
例如:
:写入配置文件(测试、空、空); 删除win.ini的测试部分
: writeprofilestring (测试,标识,空值); 从win.ini中删除标识密钥
: writeprivateprofilestring (测试、空、空、.\ex1.ini ); 删除ex1.ini的测试部分
: writeprivateprofilestring (测试、标识、空值、.\ex1.ini ); ex1.删除ini的id键
四、如何评价一个ini文件有几个部分
评估一个ini文件中有多少个子句的最简单方法是找出所有子句名称,然后计数子句名称的个数。 为了找到所有的子句名称,只要采用getprivateprofilesectionnames函数即可。 其原型如下。
dwordgetprivateprofilesectionnames (
lptstr lpszreturnbuffer,//是指包含所有返回的节名称的缓冲器
dword nsize,//参数lpszreturnbuffer的大小
lpctstr lpfilename //文件名。 如果该ini文件与程序位于同一目录中,则为、
//可以采用相对传球,否则绝对需要传球
)
以下函数用于合计一个ini文件中总共有多少个部分。 当然,如果需要每个部分的每个键及其值,可以通过查找该部分的名称轻松地获得。
/*统计有几节
节名分离方法: chsectionnames数组的第一个字符为'; ([109]和# 39; 文字的情况下
有0个小节。 否则,从chsectionnames数组的第一个字符开始依次向后查找。
'; ([111]和# 39; 文字,该文字的后续文字为'; ([111]和# 39; 文字表示前面
的文字构成一个从句名。 '; ([112]和# 39; 文字时,统计结束。 /
intctestdlg::呼叫计数(语音) ) )。
{
电信公司[ 2048 ] = {0}; //由所有节名称组成的字符数组
字符截面名称; //保留找到的某个区段名称字符串的起始地址
英特尔; //i指数组chsectionnames的某个位置,从0开始,按顺序向后移动
int j=0; //j保留下一个节名字符串开头地址相对于当前I的位置偏移量
int计数= 0; //统计子句的个数
/ /字符串名称;
/ /字符标识[ 20 ];
: getprivateprofilesectionnames (检查名称,2048,.\ex1.ini );
for(I=0; i2048; I +,j++
{
if (细胞名称[0] = = & # 39; ([125]和# 39; )
布莱克; //如果第一个字符为0,则证明ini中没有子句
if (细胞名称) = = & # 39; ([127]和# 39; )
{
截面名称= & amp; 细胞名称; 如果找到//0,则从该字符前面减去j个偏移。
//是区段名称的第一个地址
j=-1; 找到//区段名称后,恢复j的值,计算下一个区段名称地址的偏移量
之所以使用//-1,是因为子句名字符串的最后一个字符0是终止符号,不能是子句名
//的一部分
//:获取专用轮廓(截面名称、id、错误、id、20、...\ex1.ini );
名称格式( % s,标识); */
在获取//节名时,如果知道该节有那些密钥,就可以获取该节中的密钥值。
afxmessagebox (截面名称; //显示找到的东西
if (方块[ I +1] = =0() ( ) ) ) ) ) ) ) ) ) ) ) ) ) )。
{
布莱克; / /如果两个相邻字符都为0,则找到所有子句名称,然后循环结束
}
()/br/) )。
标题:“INI文件详解之Windows下读写".ini"文件的系统API”
地址:http://www.laszt.com/lhxinwen/4187.html