VC CIni

简介:

//文件  1:  

 #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:  
#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;  



     else  



         return  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;  



     else  



         return  GetLastError();  



}
  






BOOL  CIni::DelKey(LPCTSTR  lpSection,  LPCTSTR  lpKey)  



{  



     if(WritePrivateProfileString(lpSection,lpKey,NULL,m_strFileName))  



         return  FALSE;  



     else  



         return  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};  //存放一个段名。  



     GetPrivateProfileSectionNames(chSectionNames,MAX_ALLSECTIONS,m_strFileName);  






     //以下循环,截断到两个连续的0  



     for(i=0;i<MAX_ALLSECTIONS;i++)  



     {  



         if  (chSectionNames[i]==0)  



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



                   break;  



     }
  






     iMaxCount=i+1;  //要多一个0号元素。即找出全部字符串的结束部分。  



     arrSection.RemoveAll();//清空原数组  






     for(i=0;i<iMaxCount;i++)  



     {  



         chSection[iPos++]=chSectionNames[i];  



         if(chSectionNames[i]==0)  



         {        



              arrSection.Add(chSection);  



              memset(chSection,0,MAX_SECTION);  



              iPos=0;  



         }
  






     }
  






     return  (int)arrSection.GetSize();  



}
  






int  CIni::GetKeyValues(CStringArray&  arrKey,CStringArray&  arrValue,  LPCTSTR  lpSection)  



{  



     /*  



     本函数基础:  



     GetPrivateProfileSection-  从  ini  文件中获得一个Section的全部键名及值名  



     如果ini中有一个段,其下有  "段1=值1"  "段2=值2",则返回的是  '段1=值1',0,'段2=值2',0,0  ,当你不知道      



     获得一个段中的所有键及值可以用这个。    



     
*/
  



     int  i;      



     int  iPos=0;  



     CString  strKeyValue;  



     int  iMaxCount;  



     TCHAR  chKeyNames[MAX_ALLKEYS]={0};  //总的提出来的字符串  



     TCHAR  chKey[MAX_KEY]={0};  //提出来的一个键名  






     GetPrivateProfileSection(lpSection,chKeyNames,MAX_ALLKEYS,m_strFileName);  






     for(i=0;i<MAX_ALLKEYS;i++)  



     {  



         if  (chKeyNames[i]==0)  



              if  (chKeyNames[i]==chKeyNames[i+1])  



                   break;  



     }
  






     iMaxCount=i+1;  //要多一个0号元素。即找出全部字符串的结束部分。  



     arrKey.RemoveAll();//清空原数组  



     arrValue.RemoveAll();  






     for(i=0;i<iMaxCount;i++)  



     {  



         chKey[iPos++]=chKeyNames[i];  



         if(chKeyNames[i]==0)  



         {  



              strKeyValue=chKey;  



              arrKey.Add(strKeyValue.Left(strKeyValue.Find("=")));  



              arrValue.Add(strKeyValue.Mid(strKeyValue.Find("=")+1));  



              memset(chKey,0,MAX_KEY);  



              iPos=0;  



         }
  






     }
  






     return  (int)arrKey.GetSize();  



}
  






BOOL  CIni::DelAllSections()  



{  



     int  nSection;  



     CStringArray  arrSection;  



     nSection=GetSections(arrSection);  



     for(int  i=0;i<nSection;i++)  



     {  



         if(DelSection(arrSection[i]))  



              return  GetLastError();  



     }
  



     return  FALSE;  



}
  









使用方法:  



CIni  ini("c:\\a.ini");  



int  n;  






/*获得值  



TRACE("%s",ini.GetValue("段1","键1"));  



*/
  






/*添加值  



ini.SetValue("自定义段","键1","值");  



ini.SetValue("自定义段2","键1","值",false);  



*/
  






/*枚举全部段名  



CStringArray  arrSection;  



n=ini.GetSections(arrSection);  



for(int  i=0;i<n;i++)  



TRACE("%s\n",arrSection[i]);  



*/
  






/*枚举全部键名及值  



CStringArray  arrKey,arrValue;  



n=ini.GetKeyValues(arrKey,arrValue,"段1");  



for(int  i=0;i<n;i++)  



TRACE("键:%s\n值:%s\n",arrKey[i],arrValue[i]);  



*/
  






/*删除键值  



ini.DelKey("段1","键1");  



*/
  






/*删除段  



ini.DelSection("段1");  



*/
  






/*删除全部  



ini.DelAllSections();  



*/
  
目录
相关文章
|
开发工具 Windows
[分享]总结:VC小知识!-1
说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.
|
消息中间件 开发工具 Windows