VC配置文件ini的读写

来源:互联网 发布:手机淘宝如何装修视频 编辑:程序博客网 时间:2024/05/09 00:27

VC配置文件ini的读写
       ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

一、向ini文件中写入信息的函数

1. 把信息写入系统的win.ini文件

BOOL WriteProfileString(

      LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串

      LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节

     LPCTSTR lpString       // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键

)

2. 把信息写入自己定义的.ini文件

BOOL WritePrivateProfileString(

      LPCTSTR lpAppName,      // 同上

      LPCTSTR lpKeyName,      // 同上

      LPCTSTR lpString,       // 同上

      LPCTSTR lpFileName      // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,也可使用相对

            //路径,否则需要给出绝度路径。

)

如:

::WriteProfileString("Test","id","xym");

//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym

::WritePrivateProfileString("Test","id","xym","d://vc//Ex1//ex1.ini");

//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym

//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:

::WritePrivateProfileString("Test","id","xym",".//ex1.ini");

需要注意的是,C系列的语言中,转义字符'//'表示反斜线'/'。另外,当使用相对路径时,//前的.号不能丢掉了。

二、从ini文件中读取数据的函数

1、从系统的win.ini文件中读取信息

(1) 读取字符串

DWORD GetProfileString(

      LPCTSTR lpAppName,            // 节名

      LPCTSTR lpKeyName,            // 键名,读取该键的值

      LPCTSTR lpDefault,            // 若指定的键不存在,该值作为读取的默认值

      LPTSTR lpReturnedString,      // 一个指向缓冲区的指针,接收读取的字符串

      DWORD nSize                   // 指定lpReturnedString指向的缓冲区的大小

)

如:

CString str;

::GetProfileString("Test","id","Error",str.GetBuffer(20),20);

(2) 读取整数

UINT GetProfileInt(

     LPCTSTR lpAppName,      // 同上

      LPCTSTR lpKeyName,      // 同上

      INT nDefault            // 若指定的键名不存在,该值作为读取的默认值

)

如使用以下语句写入了年龄信息:

::WriteProfileString("Test","age","25");

//在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25

则可用以下语句读取age键的值:

int age;

age=::GetProfileInt("Test","age",0);

2、从自己的ini文件中读取信息

(1) 读取字符串

DWORD GetPrivateProfileString(

      LPCTSTR lpAppName,            // 同1(1)

      LPCTSTR lpKeyName,            // 同1(1)

      LPCTSTR lpDefault,            // 同1(1)

      LPTSTR lpReturnedString,      // 同1(1)

      DWORD nSize,                  // 同1(1)

      LPCTSTR lpFileName            // 读取信息的文件名。若该ini文件与程序在同一个目录下,也可使用相     

            //对路径,否则需要给出绝度路径。

)

如:

CString str;

::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,".//ex1.ini");

或:

::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,"d://vc//Ex1//ex1.ini");

(2) 读取整数

UINT GetPrivateProfileInt(

      LPCTSTR lpAppName,      // 同上

      LPCTSTR lpKeyName,      // 同上

      INT nDefault,           // 若指定的键名不存在,该值作为读取的默认值

      LPCTSTR lpFileName      // 同上

)


如使用以下语句写入了年龄信息:

::WritePrivateProfileString("Test","age","25",".//ex1.ini");

//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25


则可用以下语句读取age键的值:

int age;

age=::GetPrivateProfileInt("Test","age",0,".//ex1.ini");


三、 删除键值或节


       回顾一下WriteProfileString函数的说明

BOOL WriteProfileString(

      LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串

      LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节

      LPCTSTR lpString       // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键

)


       由此可见,要删除某个节,只需要将WriteProfileString第二个参数设为NULL即可。而要删除某个键,则只需要将该函数的第三个参数设为 NULL即可。这是删除系统的win.ini中的节或键,类似的,要删除自己定义的ini文件中的节或键,也可做相同的操作。

       如:

::WriteProfileString("Test",NULL,NULL);      //删除win.ini中的Test节

::WriteProfileString("Test","id",NULL);      //删除win.ini中的id键


::WritePrivateProfileString("Test",NULL,NULL,".//ex1.ini");      //删除ex1.ini中的Test节

::WritePrivateProfileString("Test","id",NULL,".//ex1.ini");      //删除ex1.ini中的id键


四、如何判断一个ini文件中有多少个节

       要判断一个ini文件中有多少个节,最简单的办法就是将所有的节名都找出来,然后统计节名的个数。而要将所有的节名找出来,使用GetPrivateProfileSectionNames函数就可以了,其原型如下:

DWORD GetPrivateProfileSectionNames(

      LPTSTR lpszReturnBuffer,      // 指向一个缓冲区,用来保存返回的所有节名

      DWORD nSize,                  // 参数lpszReturnBuffer的大小

       LPCTSTR lpFileName            // 文件名,若该ini文件与程序在同一个目录下,


                                                //也可使用相对路径,否则需要给出绝度路径

)


下面的是用来统计一个ini文件中共有多少个节的函数,当然,如果需要同时找到每个节中的各个键及其值,根据找到节名就可以很容易的得到了。

 

/*统计共有多少个节

节名的分离方法:若chSectionNames数组的第一字符是'/0'字符,则表明

有0个节。否则,从chSectionNames数组的第一个字符开始,顺序往后找,

直到找到一个'/0'字符,若该字符的后继字符不是 '/0'字符,则表明前

面的字符组成一个节名。若连续找到两个'/0'字符,则统计结束*/

 

int CTestDlg::CalcCount(void)

{

TCHAR       chSectionNames[2048]={0};       //所有节名组成的字符数组

char * pSectionName; //保存找到的某个节名字符串的首地址

int i;       //i指向数组chSectionNames的某个位置,从0开始,顺序后移

int j=0;      //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量

int count=0;      //统计节的个数


//CString name;

//char id[20];

::GetPrivateProfileSectionNames(chSectionNames,2048,".//ex1.ini");  

for(i=0;i<2048;i++,j++)

{

      if(chSectionNames[0]=='/0')

       break;       //如果第一个字符就是0,则说明ini中一个节也没有

      if(chSectionNames[i]=='/0')

      {

       pSectionName=&chSectionNames[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,

            //就是一个节名的首地址


       j=-1;         //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量

            //赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名


            //的一部分

       /*::GetPrivateProfileString(pSectionName,"id","Error",id,20,".//ex1.ini");

       name.Format("%s",id);*/  

       //在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。

  

       AfxMessageBox(pSectionName);      //把找到的显示出来


       if(chSectionNames[i+1]==0)

       {

         break;      //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止

       }

      }  

}

return count;

}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

在VC程序中利用系统提供的GetPrivateProfileString及WritePrivateProfileString函数直接读写系统配置ini文件(指定目录下的Ini文件)


假设在当前目录下有一个文件名为Tets.ini的文件

用于保存用户名和密码

文件格式如下:

[Section1]

Item1=huzhifeng

Item2=1234565


1.写INI文件

void CINI_File_TestDlg::OnButtonWrite()

{

// TODO: Add your control notification handler code here


CString strSection        = "Section1";

CString strSectionKey    = "Item1";

char strBuff[256];

CString strValue       = _T("");

CString strFilePath;


strFilePath=GetCurrentDirectory(256,strBuff); //获取当前路径

strFilePath.Format("%s//Test.ini",strBuff);


GetDlgItemText(IDC_EDIT_NAME,strValue);     //获取文本框内容:即姓名

WritePrivateProfileString(strSection,strSectionKey,strValue,strFilePath); //写入ini文件中相应字段


strSectionKey="Item2";

GetDlgItemText(IDC_EDIT_PASSWORD,strValue);   //获取文本框内容:即密码

WritePrivateProfileString(strSection,strSectionKey,strValue,strFilePath);

}


2.读INI文件内容

void CINI_File_TestDlg::OnButtonRead()

{

// TODO: Add your control notification handler code here

CString strSection       = "Section1";

CString strSectionKey    = "Item1";

char strBuff[256];

CString strValue       = _T("");

CString strFilePath;


strFilePath=GetCurrentDirectory(256,strBuff); //获取当前路径

strFilePath.Format("%s//Test.ini",strBuff);


GetPrivateProfileString(strSection,strSectionKey,NULL,strBuff,80,strFilePath); //读取ini文件中相应字段的内容

strValue=strBuff;

SetDlgItemText(IDC_EDIT_NAME,strValue);


strSectionKey="Item2";

GetPrivateProfileString(strSection,strSectionKey,NULL,strBuff,80,strFilePath);

strValue=strBuff;

SetDlgItemText(IDC_EDIT_PASSWORD,strValue);


UpdateData(FALSE);

}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 口头欠下的赌债怎么办 我赌博欠了230万怎么办 被淘宝商家骗了怎么办 东西卡在喉咙里怎么办 东西粘在喉咙里怎么办 有异物卡在喉咙怎么办 喉咙老有异物感怎么办 喉咙疼有异物感怎么办 喉咙卡了小鱼刺怎么办 嗓子卡了小鱼刺怎么办 骨头卡在喉咙里怎么办 卡刺喉咙怎么办小窍门 中百购物卡过期怎么办 得仕卡过期了怎么办 超市购物卡丢了怎么办 中石化油卡丢失怎么办 etc同车换车牌了怎么办 石油加油卡丢了怎么办 石化加油卡丢了怎么办 怎么办中石化的加油卡 中石油油卡丢失怎么办 公司加油卡丢了怎么办 yy频道被回收了怎么办 油卡里的圈存怎么办 农商银行圈存怎么办 社保卡号忘记了怎么办 陕西壳牌加油卡怎么办 联通用超了流量怎么办 联通3g上不了网怎么办 车玻璃水冻住了怎么办 车里玻璃水冻了怎么办 做现货亏了60万怎么办 宿舍太吵晚上睡不着觉怎么办 脚扎了钉子肿了怎么办 龙血树叶子下垂怎么办 龙血树叶子卷曲怎么办 3岁宝宝长期便秘怎么办 4岁小儿便秘严重怎么办 3岁宝宝便秘严重怎么办 3岁宝宝一直便秘怎么办 11个月宝宝便秘怎么办