VC语言

本类阅读TOP10

·VC++下使用ADO编写数据库程序
·VC++ 学习笔记(二)
·Windows消息大全
·每个开发人员现在应该下载的十种必备工具
·在2000和xp下,隐藏进程,VC6.0测试通过!!!
·用Visual C++打造IE浏览器(1)
·Netmsg 局域网聊天程序
·教你用VC6做QQ对对碰外挂程序
·VC++学习笔记(四)
·VC++中经常使用的函数!~~

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
【原创】轻松实现一个操作ini文件的类

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 

作者:lixiaosanCSDN

 

前言

    相信很多朋友在编写自己的程序中,都需要把一些数据先期导入到程序中进行初始化。那么这个时候,比较好的做法就是把你所有的数据写入一个ini文件,然后在程序去读ini文件中的数据对行初始化。

 

.INI简介

       那么什么是ini文件呢?ini文件是Initialization file的缩写,意即初始化文件。(从名字就可以看出它的功能了吧)。不仅你自己的程序可以使用ini文件,其实windows操作系统也有自己的ini文件---win.ini,保存在%WinDir%\system32目录下。Windows通过该文件对当前操作系统进行配置。

    ini文件里的数据的存取是采取的是预先约定好的 “项-值”存储结构,各种数据被分门别类的存储。以下是win.ini 文件的部分内容。

[Mail]

MAPI=1

CMC=1

CMCDLLNAME=mapi.dll

CMCDLLNAME32=mapi32.dll

MAPIX=1

MAPIXVER=1.0.0.1

OLEMessaging=1

                    1

通过以上内容,我们可以看到,ini文件将各种数据分成很多以“[ ]”组成的节,而在每一个“节”中又包含了很多“项”,“项”后面紧跟着一个等号,等号后面则是该项的值。在该例中[Mail]就是一个“节”,MAPI是一个项,1则是MAPI的值。
    所以,它的通用形式我们可以总结成:

[Section]

Key=KeyValue

 

二.操作ini文件的API

windows SDK提供有两组APIini文件进行读写

GetPrivateProfileString

GetPrivateProfileInt

WritePrivateProfileString

GetPrivateProfileSection

WritePrivateProfileSection

GetPrivateProfileSectionNames

 

GetPrivateProfileStruct

WritePrivateProfileStruct

                                                                             2

 

GetProfileString

GetProfileInt

WriteProfileString

GetProfileSection

WritePrivateProfileSection

                                                                             3

    对用户的配置文件来说,一般我们使用的是表2中的函数,这一点从函数中的“private”就可以看出它是针对私有的配置文件的函数(又是废话!)。而表3中的函数则是提供给针对系统配置文件,即win.ini进行操作的函数。现只准备介绍表2中的函数,这也是使用率最高的,表3中的函数操作和表2中的函数操作类同,故略。

      
    现在我们来看看这几个函数的功能:

DWORD GetPrivateProfileString(

  LPCTSTR lpAppName,           //节名,即Section

  LPCTSTR lpKeyName,           //项名,即Key

  LPCTSTR lpDefault,                //缺省返回字符串。如lpKeyName未找到,拷贝lpDefaultlpReturnedString

  LPTSTR lpReturnedString,       //返回字符串的缓冲地址

  DWORD nSize,                       //缓冲大小

  LPCTSTR lpFileName             //ini文件路径

);

功能:根据指定的Section Key得到KeyValue,存放在lpReturnedString

返回:返回拷贝到缓冲中的字符个数。不包括结束符

 

UINT GetPrivateProfileInt(

  LPCTSTR lpAppName,           //节名,即Section
 
LPCTSTR lpKeyName          //项名,即Key

  INT nDefault,                           //缺省返回整型值。如lpKeyName未找到,函数返回nDefault的值

  LPCTSTR lpFileName             //ini文件路径

);

功能:根据指定的Section Key得到整型KeyValue

返回:返回得到的整型KeyValue

 

BOOL WritePrivateProfileString(

  LPCTSTR lpAppName,           //节名,即Section
 
LPCTSTR lpKeyName,           //项名,即Key

  LPCTSTR lpString,                  //要写入的字符串

  LPCTSTR lpFileName             //ini文件路径
);

功能:向指定的Section Key写入KeyValue。
      如果lpStringNULL,则删除当前lpKeyName

    如果lpKeyName=lpString=NULL,则删除当前Section以及其下的所有Key

       如果Section或者Key不存在,则创建;存在则覆盖

返回:写入成功。

 

DWORD GetPrivateProfileSectionNames(

  LPTSTR lpszReturnBuffer,             //存放所有Section的缓冲地址

  DWORD nSize,                             //缓冲大小

  LPCTSTR lpFileName                   //ini文件路径

);

功能:得到ini文件中所有Section名。

返回:返回拷贝到缓冲中的字符个数。不包括结束符。
注意:返回的所有Section在缓冲中的存放格式为“Section1”,0,“Section2”,0。。。。

      若需要得到具体的每个Section,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解
      析步骤。



DWORD GetPrivateProfileSection(

  LPCTSTR lpAppName,                   //节名,即Section   

  LPTSTR lpReturnedString,              //存放指定Section下所有的KeyKeyValue的缓冲地址

  DWORD nSize,                              //缓冲大小

  LPCTSTR lpFileName                     //ini文件路径

);

功能:得到指定Section下所有的KeyKeyValue

返回:返回拷贝到缓冲中的字符个数。不包括结束符。

注意:返回的“项-值对”在缓冲中的存放格式为“Key1=KeyValue1”,0,“Key2=KeyValue2”,0 。。。。

若需要得到具体的KeyKeyValue,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解析步骤。

GetPrivateProfileStructWritePrivateProfileStruct用的较少,本文也未介绍,感兴趣的朋友可以自己看看MSDN,里面也有详细介绍。

 

 

三.一个ini的类

    有了以上的API后,我们就可以轻松的制作一个简单的操作ini文件的类了。

 

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

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

 

         //    从指定的SectionKey读取KeyValue
        
//    返回KeyValue

         CString         GetKeyValue(CString    strSection,

                                                        CString    strKey);        

        

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

         void          SetKeyValue(CString    strSection,

                                                   CString    strKey,

                                                   CString    strKeyValue);

 

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

         void          DeleteKey(CString strSection,

                                               CString strKey);

 

         //