登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

轻松实现一个操作ini文件的类  

2009-05-31 11:07:24|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

// File: IniFile.h

// Date: October 2004

// Author: lixiaosan

// Email: airforcetwo@163.com

// Copyright (c) 2004. All Rights Reserved.

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

 

#if !defined(AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_)

#define AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

class CIniFile 

{

public:

         CIniFile();

         virtual ~CIniFile();

 

         //    设置ini文件路径

    //    成功返回TRUE;否则返回FALSE

         BOOL         SetPath(CString strPath);

        

         //    检查section是否存在

    //    存在返回TRUE;否则返回FALSE

         BOOL         SectionExist(CString strSection);

 

         //    从指定的Section和Key读取KeyValue

        //    返回KeyValue

         CString         GetKeyValue(CString    strSection,

                                                        CString    strKey);        

        

         //    设置Section、Key以及KeyValue,若Section或者Key不存在则创建

         void          SetKeyValue(CString    strSection,

                                                   CString    strKey,

                                                   CString    strKeyValue);

 

         //    删除指定Section下的一个Key

         void          DeleteKey(CString strSection,

                                               CString strKey);

 

         //    删除指定的Section以及其下的所有Key

         void          DeleteSection(CString strSection);

 

         //    获得所有的Section

        //    返回Section数目

         int              GetAllSections(CStringArray& strArrSection);

        

         //    根据指定Section得到其下的所有Key和KeyValue

        //    返回Key的数目

         int              GetAllKeysAndValues(CString strSection,

                                                                     CStringArray& strArrKey,

                                                                     CStringArray& strArrKeyValue);

 

         //       删除所有Section

         void          DeleteAllSections();

        

private:

         //       ini文件路径

         CString m_strPath;

 

        

};

 

#endif // !defined(AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_)

 

 

 

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

// File: IniFile.cpp

// Date: October 2004

// Author: lixiaosan

// Email: airforcetwo@163.com

// Copyright (c) 2004. All Rights Reserved.

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

 

#include "stdafx.h"

//#include "test6.h"

#include "IniFile.h"

 

 

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

 

#define         MAX_SECTION                260        //Section最大长度

#define         MAX_KEY                         260        //KeyValues最大长度

#define         MAX_ALLSECTIONS     65535    //所有Section的最大长度

#define         MAX_ALLKEYS              65535    //所有KeyValue的最大长度

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

// Construction/Destruction

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

 

CIniFile::CIniFile()

{

 

}

 

CIniFile::~CIniFile()

{

 

}

 

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

//   Public Functions

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

 

BOOL CIniFile::SetPath(CString strPath)

{

         m_strPath = strPath;

        

         //       检查文件是否存在

         DWORD  dwFlag = GetFileAttributes((LPCTSTR)m_strPath);

        

         //       文件或者路径不存在,返回FALSE

         if( 0xFFFFFFFF == dwFlag )

                   return FALSE;

        

         //       路径是目录,返回FALSE

         if (  FILE_ATTRIBUTE_DIRECTORY & dwFlag )

                   return FALSE;

 

         return TRUE;

}

 

BOOL CIniFile::SectionExist(CString strSection)

{

         TCHAR chSection[MAX_SECTION];

         DWORD dwRetValue;

 

         dwRetValue = GetPrivateProfileString(

                  (LPCTSTR)strSection,

                   NULL,

                   _T(""),

                  chSection,

                  sizeof(chSection)/sizeof(TCHAR),

                  (LPCTSTR)m_strPath);

 

         return (dwRetValue>0);

}

 

CString CIniFile::GetKeyValue(CString strSection,

                                                         CString strKey)

{

         TCHAR         chKey[MAX_KEY];

         DWORD         dwRetValue;

         CString strKeyValue=_T("");

 

         dwRetValue = GetPrivateProfileString(

                  (LPCTSTR)strSection,

                  (LPCTSTR)strKey,

                   _T(""),

                   chKey,

                  sizeof(chKey)/sizeof(TCHAR),

                  (LPCTSTR)m_strPath);      

        

         strKeyValue = chKey;

        

         return strKeyValue;

 

}

 

void CIniFile::SetKeyValue(CString strSection,

                                                 CString strKey,

                                                 CString strKeyValue)

{

         WritePrivateProfileString(

                  (LPCTSTR)strSection,

                  (LPCTSTR)strKey,

                  (LPCTSTR)strKeyValue,

                  (LPCTSTR)m_strPath);

}

 

void CIniFile::DeleteKey(CString strSection, CString strKey)

{

         WritePrivateProfileString(

                  (LPCTSTR)strSection,

                  (LPCTSTR)strKey,

                   NULL,          //       这里写NULL,则删除Key

                  (LPCTSTR)m_strPath);

}

 

void CIniFile::DeleteSection(CString strSection)

{

         WritePrivateProfileString(

                  (LPCTSTR)strSection,

                   NULL,         

                   NULL,          //       这里都写NULL,则删除Section

                  (LPCTSTR)m_strPath);

}

 

int CIniFile::GetAllSections(CStringArray& strArrSection)

{

         int dwRetValue, i, j, iPos=0;

         TCHAR chAllSections[MAX_ALLSECTIONS];

         TCHAR chTempSection[MAX_SECTION];

 

         ZeroMemory(chAllSections, MAX_ALLSECTIONS);

         ZeroMemory(chTempSection, MAX_SECTION);

 

         dwRetValue = GetPrivateProfileSectionNames(

                  chAllSections,

                  MAX_ALLSECTIONS,

                  m_strPath);

 

         //       因为Section在数组中的存放形式为“Section1”,0,“Section2”,0,0。

    //       所以如果检测到连续两个0,则break

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

         {

                  if( chAllSections[i] == NULL )

                   {

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

                                     break;

                   }

         }

        

         i++; //         保证数据读完

         strArrSection.RemoveAll(); //         清空数组

        

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

         {

                  chTempSection[iPos++] = chAllSections[j];

                  if( chAllSections[j] == NULL )

                   { 

                            strArrSection.Add(chTempSection);

                            ZeroMemory(chTempSection, MAX_SECTION);

                            iPos = 0;

                   }

         }

        

         return strArrSection.GetSize();

}

 

int CIniFile::GetAllKeysAndValues(CString  strSection,

                                                            CStringArray&         strArrKey,

                                                            CStringArray& strArrKeyValue)

{

         int dwRetValue, i, j, iPos=0;

         TCHAR chAllKeysAndValues[MAX_ALLKEYS];

         TCHAR chTempkeyAndValue[MAX_KEY];

         CString strTempKey;

 

         ZeroMemory(chAllKeysAndValues, MAX_ALLKEYS);

         ZeroMemory(chTempkeyAndValue, MAX_KEY);

 

         dwRetValue = GetPrivateProfileSection(

                  strSection,

                  chAllKeysAndValues,

                  MAX_ALLKEYS,

                  m_strPath);

 

         //       因为Section在数组中的存放形式为“Key1=KeyValue1”,0,“Key2=KeyValue2”,0

         //       所以如果检测到连续两个0,则break

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

         {

                  if( chAllKeysAndValues[i] == NULL )

                   {

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

                                     break;

                   }

         }

        

         i++;

         strArrKey.RemoveAll();

         strArrKeyValue.RemoveAll();

        

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

         {

                  chTempkeyAndValue[iPos++] = chAllKeysAndValues[j];

                  if( chAllKeysAndValues[j] == NULL )

                   { 

                            strTempKey = chTempkeyAndValue;

                            strArrKey.Add( strTempKey.Left(strTempKey.Find('=')) );

                            strArrKeyValue.Add( strTempKey.Mid(strTempKey.Find('=')+1) );

                            ZeroMemory(chTempkeyAndValue, MAX_KEY);

                            iPos = 0;

                   }

         }

        

         return strArrKey.GetSize();

}

 

void CIniFile::DeleteAllSections()

{

         int nSecNum;

         CStringArray strArrSection;

         nSecNum = GetAllSections(strArrSection);

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

         {

                  WritePrivateProfileString(

                            (LPCTSTR)strArrSection[i],

                            NULL,

                            NULL,

                            (LPCTSTR)m_strPath);      

         }

}

 

 

 

 

 

四.例子

比如在存在一个myfile.ini文件,内容如下:

[student]

number=40

male=25

female=15

average_age=15

 

[computer]

cpu=2.0

motherboard=ASUS

harddisk=120

ram=512

display=sansung

 

现在把IniFile.h和IniFile.cpp 加入到你的工程中。在使用他的类中#include “IniFile.h”;

 

         CIniFile file;

         CStringArray arrSection, arrKey, arrkeyValue;

         file.SetPath("f:\\ myfile.ini");

         CString str="";

 

         if(file.SectionExist("student"))

         {

                  //str="15"

                   str = file.GetKeyValue("student", "female");

                  

                   //设置number为50

                  file.SetKeyValue("student", "number", "50");

 

                   //因为在student中computer_num不存在,所以增加一项

                  file.SetKeyValue("student", "computer_num", "30");

 

                   //得到所有section

                   int num = file.GetAllSections(arrSection);

                   str = "";

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

                   {

                            str += arrSection[i] + " ";//str="student computer ";

                   }

 

                   //得到所有Key和KeyValue

                   int num = file.GetAllKeysAndValues("computer", arrKey, arrkeyValue);

                   str = "";

                   for(int j=0; j<num; j++)

                   {

                            //arrKey保存了computer下所有的Key

                            //arrkeyValue保存了computer下所有的KeyValue

                            str = arrKey[j];

                            str = arrkeyValue[j];

                   }

                   //删除student下的computer_num

                  file.DeleteKey("student", "computer_num");

 

                   //删除student

                  file.DeleteSection("student");

     }

    有兴趣的朋友,可以在该类基础上进行扩展,添加你自己喜欢的功能。比如说返回int而不是字符串。

  评论这张
 
阅读(639)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018