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();  



*/  

时间: 2024-08-01 15:38:08

VC CIni的相关文章

VC的文件操作

各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析. 1.文件的查找  当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找.MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找.下面这段代码演示了这个类的最

代码-vc 6.0 error c2491 报错啊,头大

问题描述 vc 6.0 error c2491 报错啊,头大 简单又奇怪的问题又来了... debug版完全正常:release版报错c2491. definition of dllimport function not allowed. (我是接手的别人的项目,项目工程代码里没有看到有dllimport 或者是其他明显的问题啊). 解决方案 检查一下你Release版本跟Debug版本的工程配置,尤其预编译宏的设置. 应该有宏定义不一致,导致dllexport,dllimport的导入 解决方

环境-vc++6.0内关于s=(i++)*(i++)的问题

问题描述 vc++6.0内关于s=(i++)*(i++)的问题 int i = 0: s = (i++)*(i++) printf("%d",s): 这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解. 解决方案 这个问题问了无数遍,我想这么告诉你. 就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到

VC++动态链接库(DLL)编程之库的调试与查看

  在具体进入各类DLL的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程. 由于库文件不能单独执行,因而在按下F5(开始debug模式执行)或CTRL+F5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行.这个时候我们输入要调用该库的EXE文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样. 通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一VC工作区,只对

请问VC++ 怎样处理DPI才能使界面不发虚?

问题描述 请问VC++ 怎样处理DPI才能使界面不发虚? VisualStudio 2015 界面引擎 Sciter 生成的程序界面发虚,怎样处理? 左侧的模糊 右侧的为添加dpi-aware.manifest后的效果 解决方案 贴出图看下是怎么个虚?应该和dpi无关,而是和你绘制字体的反锯齿选项有关.

VC++字符串格式输出问题?

问题描述 VC++字符串格式输出问题? 如上如所示,我想将一个LPCTSTR型字符串格式化输出,但sprintf貌似不能实现这个功能,我想转换的结果也是LPCTSTR类型以作为loadBitmap()的参数,请问我该怎么办?谢谢! 解决方案 使用Fromat函数,比如: CString path: path.Fromat(_T("FlashDisk:picSrc%s.bmp"), name); 解决方案二: sprintf有对应的宽字符版本的wsprintf我记得好像是 解决方案三:

VC++6.0如何添加头文件(graphics.h)??

问题描述 VC++6.0如何添加头文件(graphics.h)?? 'graphics.h': No such file or directory Error executing cl.exe. 编译中出现这个问题(本人初学者),网上说要添加头文件,按照网上的教程结果错误更多了,头文件添加不成功,请求大神支援,怎么破??? (详细一点可以么?最好附上截图,万分感谢!) 解决方案 初学者的话,建议你换Borland C++或者Turbo C++ 这是是属于DOS时代Borland搞出来的一个绘图库

VC编写有图形界面的Windows服务程序

环境:Windows 2003,VC 6.0 摘要:从建立一个COM服务程序入手,然后将一个MFC项目改造成服务程序,最后让这一程序在启动时可以显示图形界面. 关键字:windows服务程序 COM服务程序 开机前启动 NT服务 与桌面交互 一.什么是windows的服务程序? 可以使用下面的几种方法看到它. 打开控制面板,然后是管理工具,里面有一个"服务",双击后打开: 或者是通过输入命令的方式,打开开始菜单,点击运行,输入mmc services.msc(mmc可省略),也可打开:

vc++2010创建项目失败,无法计算xxx处的属性表达式的值

问题描述 vc++2010创建项目失败,无法计算xxx处的属性表达式的值 vc++2010创建项目失败,报错如下图,求教高手提点. 解决方案 是新建的项目的话,建议重装下vs,再不行重装下系统.