当前位置:文档之家› VC++操作INI配置文件的实现

VC++操作INI配置文件的实现

VC++操作INI配置文件的实现修改浏览权限| 删除一.将信息写入.INI文件中.1.所用的WINAPI函数原型为:BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);其中各参数的意义:LPCTSTR lpAppName 是INI文件中的一个字段名.LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.LPCTSTR lpFileName 是完整的INI文件名.2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入c:\stud\student.ini 文件中.CString strName,strTemp;int nAge;strName="张三";nAge=12;WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");此时c:\stud\student.ini文件中的内容如下:[StudentInfo]Name=张三3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:strTemp.Format("%d",nAge);WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");二.将信息从INI文件中读入程序中的变量.1.所用的WINAPI函数原型为:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);其中各参数的意义:前二个参数与WritePrivateProfileString中的意义一样.lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.nSize : 目的缓存器的大小.lpFileName : 是完整的INI文件名.2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.CString strStudName;int nStudAge;GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");执行后strStudName 的值为:"张三",若前两个参数有误,其值为:"默认姓名".3.读入整型值要用另一个WINAPI函数:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);这里的参数意义与上相同.使用方法如下:nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");三.循环写入多个值,设现有一程序,要将最近使用的几个文件名保存下来,具体程序如下:1.写入:CString strTemp,strTempA;int i;int nCount=6;file://共有6个文件名需要保存for(i=0;i<6;I++){strTemp.Format(_T("file%d"),i);//strTempA=文件名WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,_T("c:\\usefile\\usefile.ini")); }strTemp.Format("%d",nCount);::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");file://将文件总数写入,以便读出.2.读出:nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");for(i=0;i<6;i++){strTemp.Format("%d",i);strTemp="FileName"+strTemp;GetPrivateProfileString("CurrentIni",strTemp,"default.fil",strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");file://使用strTempA中的内容.}补充几点:1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回FALSE 值.2.文件名的路径中必须为\\ ,因为在VC++中, \\ 才表示一个\ .3.也可将INI文件放在程序所在目录,此时lpFileName 参数为: ".\\student.ini".//----------------------------------------------------------------------------------/*类名:CManageIni版本:v1类描述:本类可以于ini文件进行操作*/文件1: Manageini.h#pragma once#include "afxTempl.h"class CIni{private:CString m_strFileName;public:CIni(CString strFileName):m_strFileName(strFileName){}public://一般性操作:BOOL SetFileName(LPCTSTR lpFileName); //设置文件名CString GetFileName(void); //获得文件名BOOL SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue,bool bCreate=true); //设置键值,bCreate是指段名及键名未存在时,是否创建。

CString GetValue(LPCTSTR lpSection, LPCTSTR lpKey); //得到键值.BOOL DelSection(LPCTSTR strSection); //删除段名BOOL DelKey(LPCTSTR lpSection, LPCTSTR lpKey); //删除键名public://高级操作:int GetSections(CStringArray& arrSection); //枚举出全部的段名int GetKeyValues(CStringArray& arrKey,CStringArray& arrValue,LPCTSTR lpSection); //枚举出一段内的全部键名及值BOOL DelAllSections();};文件2:manageini.cpp#include "StdAfx.h"#include "ini.h"#define MAX_ALLSECTIONS 2048 //全部的段名#define MAX_SECTION 260 //一个段名长度#define MAX_ALLKEYS 6000 //全部的键名#define MAX_KEY 260 //一个键名长度BOOL CIni::SetFileName(LPCTSTR lpFileName){CFile file;CFileStatus status;if(!file.GetStatus(lpFileName,status))return TRUE;m_strFileName=lpFileName;return FALSE;}CString CIni::GetFileName(void){return m_strFileName;}BOOL CIni::SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue,bool bCreate) {TCHAR lpTemp[MAX_PATH] ={0};//以下if语句表示如果设置bCreate为false时,当没有这个键名时则返回TRUE(表示出错)//!*&*none-value*&!* 这是个垃圾字符没有特别意义,这样乱写是防止凑巧相同。

if (!bCreate){GetPrivateProfileString(lpSection,lpKey,"!*&*none-value*&!*",lpTemp,MAX_PATH,m_strFileName); if(strcmp(lpTemp,"!*&*none-value*&!*")==0)return TRUE;}if(WritePrivateProfileString(lpSection,lpKey,lpValue,m_strFileName))return FALSE;elsereturn GetLastError();}CString CIni::GetValue(LPCTSTR lpSection, LPCTSTR lpKey){DWORD dValue;TCHAR lpValue[MAX_PATH] ={0};dValue=GetPrivateProfileString(lpSection,lpKey,"",lpValue,MAX_PATH,m_strFileName);return lpValue;}BOOL CIni::DelSection(LPCTSTR lpSection){if(WritePrivateProfileString(lpSection,NULL,NULL,m_strFileName))return FALSE;elsereturn GetLastError();}BOOL CIni::DelKey(LPCTSTR lpSection, LPCTSTR lpKey){if(WritePrivateProfileString(lpSection,lpKey,NULL,m_strFileName))return FALSE;elsereturn GetLastError();}int CIni::GetSections(CStringArray& arrSection){/*本函数基础:GetPrivateProfileSectionNames - 从ini 文件中获得Section 的名称如果ini 中有两个Section: [sec1] 和[sec2],则返回的是'sec1',0,'sec2',0,0 ,当你不知道ini 中有哪些section 的时候可以用这个api 来获取名称*/int i;int iPos=0;int iMaxCount;TCHAR chSectionNames[MAX_ALLSECTIONS]={0}; //总的提出来的字符串TCHAR chSection[MAX_SECTION]={0}; //存放一个段名。

相关主题