• c/c++写的比较好的读写配置文件的函数或者类


    共用版 
    .h文件
    //----------------------------------------------------------------------------
    // 程序名称:   ConfigFile.h
    // 程序说明:   类 ConfigFile 的定义
    // 程序作者:   
    // 程序版本:   1.0
    // 开始日期:   1999-01-10
    //----------------------------------------------------------------------------

    #ifndef __CONFIGFILE_H__
    #define __CONFIGFILE_H__

    #include <fstream>;
    #include <iostream>;

    using namespace std;

    #define MAX_LINE_LENGTH 300

    //----------------------------------------------------------------------------
    // 类说明:用于对配置文件进行操作,对于给定的节名和变量名,获得变量的值。
    //----------------------------------------------------------------------------
    class CConfigFile
    {
    //构造函数和析构函数
    private:    //私有
       
    protected:  //保护
       
    public:     //公有
        CConfigFile();
        CConfigFile(char *pConfigFileName);
        ~CConfigFile();
       

    //属性
    private:    //私有
        fstream m_CfgFile;
        short     m_IsOpen;  //文件打开状态
        enum
        {
          IS_COMMENT ,    //是注释
          IS_SESSION ,    //是节名
          IS_VALUE,       //是变量的值
          NOT_FOUND       //没有找到指定的变量名
        };
       
    protected:  //保护
       
    public:     //公有
       

    //服务
    private:    //私有
        //查找一个指定的节名
        short  GetSession(char *pStr,char *SessionName);
        //获得变量的值
        short GetContent(char *pStr,char *ValueName,char *RetStr);
       
    protected:  //保护
       
    public:     //公有
        //打开一个指定的配置文件
        short  Open(char *ConfigFileName);
        //关闭配置文件
        void   Close();
        //根据给定的节名和变量名,从文件中读出变量的值
        short  GetValue(char *Session,char *ValueName,char *RetStr);
        //返回文件打开状态
        short  IsOpen() { return m_IsOpen; };
       
    };

    #endif //__CONFIGFILE_H__



    cpp文件
    #include "ConfigFile.h"
    #include <string.h>;

    //----------------------------------------------------------------------------
    // 函数原型: CConfigFile::CConfigFile()
    // 函数功能: CConfigFile 构造函数
    // 传入参数: 无
    // 传出参数: 无
    // 函数返回: 无
    // 注意事项: 无
    //----------------------------------------------------------------------------
    CConfigFile::CConfigFile()
    {
      m_IsOpen = -1;
    }

    //----------------------------------------------------------------------------
    // 函数原型: CConfigFile::CConfigFile(char *pConfigFileName)
    // 函数功能: CConfigFile 构造函数
    // 传入参数: char *pConfigFileName  配置文件名
    // 传出参数: 无
    // 函数返回: 无
    // 注意事项: 无
    //----------------------------------------------------------------------------
    CConfigFile::CConfigFile(char *pConfigFileName)
    {
      m_IsOpen = -1;
      Open(pConfigFileName);
    }

    //----------------------------------------------------------------------------
    // 函数原型: CConfigFile::~CConfigFile()
    // 函数功能: CConfigFile 析构函数
    // 传入参数: 无
    // 传出参数: 无
    // 函数返回: 无
    // 注意事项: 无
    //----------------------------------------------------------------------------
    CConfigFile::~CConfigFile()
    {
      if (m_IsOpen == 0)
        m_CfgFile.close();
    }

    //----------------------------------------------------------------------------
    // 函数原型: short  CConfigFile::Open(char *ConfigFileName)
    // 函数功能: 打开指定的配置文件
    // 传入参数: char *ConfigFileName  配置文件名
    // 传出参数: 无
    // 函数返回: 0  打开文件成功
    //            -1 打开文件失败
    // 注意事项: 无
    //----------------------------------------------------------------------------
    short  CConfigFile::Open(char *ConfigFileName)
    {
      //如果已经有一个文件打开,则先关闭
      if ( m_IsOpen == 0 )
      {
        m_CfgFile.close();
        m_IsOpen == -1;
      }
      //打开指定的配置文件,失败返回-1
      m_CfgFile.open(ConfigFileName,ios::in);
      if( !m_CfgFile )
        return -1;

      m_IsOpen = 0;
      return 0;
    }

    //----------------------------------------------------------------------------
    // 函数原型: void CConfigFile::Close()
    // 函数功能: 关闭配置文件
    // 传入参数: 无
    // 传出参数: 无
    // 函数返回: 无
    // 注意事项: 无
    //----------------------------------------------------------------------------
    void CConfigFile::Close()
    {
      if ( m_IsOpen == 0 )
        m_CfgFile.close();
    }

    //----------------------------------------------------------------------------
    // 函数原型: short  CConfigFile::GetValue(char *Session,char *ValueName,char *RetStr)
    // 函数功能: 从配置文件中读出指定的变量的值
    // 传入参数: char *Session   变量所在节的名称
    //            char *ValueName 变量的名称
    //            char *RetStr    存放返回字符串的空间指针
    // 传出参数: 无
    // 函数返回: 0  读到指定变量的值
    //            -1 未读到指定变量的值
    // 注意事项: 无
    //----------------------------------------------------------------------------
    short  CConfigFile::GetValue(char *Session,char *ValueName,char *RetStr)
    {
      char          tmpstr[MAX_LINE_LENGTH];
      short          Flag;
      short         Ret;

      m_CfgFile.seekg(0,ios::beg);
      //找到对应的节
      Flag = -1;
      while(!m_CfgFile.eof())
      {
        m_CfgFile.getline(tmpstr,MAX_LINE_LENGTH);
        if ( GetSession(tmpstr,Session) == 0 )
        {
          Flag = 0;
          break;
        }
      }

      if ( Flag == -1 )
        return -1;

      //获得对应的变量的值
      Flag = -1;
      while(!m_CfgFile.eof())
      {
        m_CfgFile.getline(tmpstr,MAX_LINE_LENGTH);
        Ret = GetContent(tmpstr,ValueName,RetStr);
        if (  (Ret == IS_COMMENT) || (Ret == NOT_FOUND))   
          continue;
        else if( Ret == IS_SESSION )
          break;
        Flag = 0;
    //    cerr << Session << " " << ValueName << "=" << RetStr << endl;
        break;
      }
      
      return Flag;
    }

    //----------------------------------------------------------------------------
    // 函数原型: short CConfigFile::GetSession(char *pStr,char *SessionName)
    // 函数功能: 从指定的字符串中查找一个节(在[]中的字符串)的名称
    // 传入参数: char *pStr 指定的字符串
    //            char *SessionName 所要查找的节名
    // 传出参数: 无
    // 函数返回: 0  找到指定的节名
    //            -1 未找到指定的节名
    // 注意事项: 无
    //----------------------------------------------------------------------------
    short CConfigFile::GetSession(char *pStr,char *SessionName)
    {
      char TmpStr[100];
      int i=0;
      int j = 0;

      while( pStr == ' ' ) i++;   //跳过空格
      
      if( pStr
     != '[' )
        return -1;  //不是节名
      
      i++; //跳过'['
      
      while( pStr == ' ' ) i++; //跳过空格
      
      //获得节名
      while( pStr
     != ' ' &amp;&amp; pStr != ']' )
      {
            TmpStr[j] = pStr
    ;
            i++;
            j++;
      }
      TmpStr[j] = 0;

      if( strcmp(TmpStr,SessionName) != 0 )
        return -1; //不是指定的节名

      return 0;
    }

    //----------------------------------------------------------------------------
    // 函数原型: short CConfigFile::GetContent(char *pStr,char *ValueName,char *RetStr)
    // 函数功能: 从指定的字符串中获得变量的值
    // 传入参数: char *pStr      指定的字符串
    //            char *ValueName 变量的名称
    //            char *RetStr    存放返回字符串的空间指针
    // 传出参数: 无
    // 函数返回: IS_VALUE 读到变量的值
    //            IS_COMMENT 是注释
    //            IS_SESSION 是节名
    //            NOT_FOUND  没有找到指定的变量名
    // 注意事项: 无
    //----------------------------------------------------------------------------
    short CConfigFile::GetContent(char *pStr,char *ValueName,char *RetStr)
    {
      char TmpStr[100];
      int i=0;
      int j = 0;

      RetStr[0] = 0;
      
      while( pStr == ' ' ) i++; //去掉开头的空格

      if( pStr
     == '#' ) return IS_COMMENT;  //是注释
      if( pStr == '[' ) return IS_SESSION;  //是节名
      if( pStr
     == 0   ) return NOT_FOUND;   //已到行尾,未找到
      
      //获得变量名
    //  while( pStr != ' ' &amp;&amp; pStr != '=' &amp;&amp; pStr != 0)
    //modified by luxd
      while( pStr
     != ' ' &amp;&amp;pStr!=' ' &amp;&amp; pStr != '=' &amp;&amp; pStr != 0)
      {
            TmpStr[j] = pStr
    ;
            i++;
            j++;
      }
      TmpStr[j] = 0;

      if( strcmp(TmpStr,ValueName) != 0 )
        return NOT_FOUND;  //不是指定的变量
       
    //  while( pStr == ' ' || pStr == '=' ) i++; //去掉空格及'='
    // modified by luxd
      while( pStr == ' ' || pStr==' ' || pStr == '=' ) i++; //去掉空格及'='
      
      //获得变量的值
      j=0;
      while( pStr
     >;' ' &amp;&amp; pStr != '#' &amp;&amp; pStr != 127)
      {
        RetStr[j] = pStr;
        i++;
        j++;
      }
      RetStr[j] = 0;
      
      return IS_VALUE;
    }


    原文地址:http://blog.sina.com.cn/s/blog_67a1496f0100imci.html


  • 相关阅读:
    关于数据库的alter table操作和索引概念
    mysql_fetch_array()和 mysql_fetch_array()的区别
    left 截取
    学会设置五大类MySQL参数
    MySQL性能优化的最佳20+条经验
    varchar to int error
    2003服务器重启
    缺少注释的结尾标记 '*/'。 '*' 附近有语法错误。
    2003的服务器终端服务器超出最大连接数的解决办法转载
    电脑报警音解读转载
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218451.html
Copyright © 2020-2023  润新知