freecplus框架-加載參數文件

1、源代碼說明

freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。數據庫

本文介紹的是freecplus框架中加載參數文件的方法。數組

函數和類的聲明文件是freecplus/_freecplus.h。服務器

函數和類的定義文件是freecplus/_freecplus.cpp。數據結構

示例程序位於freecplus/demo目錄中。框架

編譯規則文件是freecplus/demo/makefile。ide

2、參數文件的意義

在項目開發中,一個完整的系統由多個C/C++服務程序組成,這些服務程序有共同的參數,例如數據庫的鏈接參數、日誌文件存放的目錄、數據文件存放的目錄等。函數

傳統的方法是把參數放在文本文件中,例如hssms.ini,格式以下:.net

logpath=/log/hssms              # 日誌文件存放的目錄。
connstr=hssms/smspwd@hssmszx  # 數據庫鏈接參數。
datapath=/data/hssms            # 數據文件存放的根目錄。
serverip=192.168.1.1            # 中心服務器的ip地址。
port=5058                         # 中心服務器的通訊端口。
online=true                       # 是否採用長鏈接。

如今有更好的方法是把參數放在xml文件中,例如hssms.xml,格式以下:日誌

<?xml version="1.0" encoding="gbk" ?>
<root>
    <!-- 程序運行的日誌文件名。 -->
    <logpath>/log/hssms</logpath>

    <!-- 數據庫鏈接參數。 -->
    <connstr>hssms/smspwd@hssmszx</connstr>

    <!-- 數據文件存放的根目錄。 -->
    <datapath>/data/hssms</datapath>

    <!-- 中心服務器的ip地址。 -->
    <serverip>192.168.1.1</serverip>

    <!-- 中心服務器的通訊端口。 -->
    <port>5058</port>

    <!-- 是否採用長鏈接,true-是;false-否。 -->
    <online>true</online>
</root>

通常來講,一個項目是由多種語言開發完成,xml文件格式比傳統的ini文件格式更方便。code

3、CIniFile類

CIniFile類用於服務程序從參數文件中加載參數。

一、類的聲明

// 參數文件操做類。
// CIniFile類操做的是xml格式的參數文件,並非傳統的ini文件。
class CIniFile
{
public:
  // 存放參數文件所有的內容,由LoadFile載入到本變量中。
  string m_xmlbuffer;

  CIniFile();

  // 把參數文件的內容載入到m_xmlbuffer變量中。
  bool LoadFile(const char *filename);

  // 獲取參數文件字段的內容。
  // fieldname:字段的標籤名。
  // value:傳入變量的地址,用於存放字段內容,支持bool、int、insigned int、long、unsigned long、double和char[]。
  // 注意,當value參數的數據類型爲char []時,必須保證value數組的內存足夠,不然可能發生內存溢出的問題,
  // 也能夠用ilen參數限定獲取字段內容的長度,ilen的缺省值爲0,表示不限定獲取字段內容的長度。
  // 返回值:true-獲取成功;false-獲取失敗。
  bool GetValue(const char *fieldname,bool *value);
  bool GetValue(const char *fieldname,int  *value);
  bool GetValue(const char *fieldname,unsigned int *value);
  bool GetValue(const char *fieldname,long *value);
  bool GetValue(const char *fieldname,unsigned long *value);
  bool GetValue(const char *fieldname,double *value);
  bool GetValue(const char *fieldname,char *value,const int ilen=0);
};

二、示例程序

示例(demo45.cpp)

/*
 *  程序名:demo45.cpp,此程序演示採用freecplus框架的CIniFile類加載參數文件。
 *  做者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include "../_freecplus.h"

// 用於存放本程序運行參數的數據結構。
struct st_args
{
  char logpath[301];
  char connstr[101];
  char datapath[301];
  char serverip[51];
  int  port;
  bool online;
}stargs;

int main(int argc,char *argv[])
{
  // 若是執行程序時輸入的參數不正確,給出幫助信息。
  if (argc != 2) 
  { 
    printf("\nusing:/freecplus/demo/demo45 inifile\n"); 
    printf("samples:/freecplus/demo/demo45 /freecplus/ini/hssms.xml\n\n"); 
    return -1;
  }

  // 加載參數文件。
  CIniFile IniFile;
  if (IniFile.LoadFile(argv[1])==false)
  {
    printf("IniFile.LoadFile(%s) failed.\n",argv[1]); return -1;
  } 

  // 獲取參數,存放在stargs結構中。
  memset(&stargs,0,sizeof(struct st_args));
  IniFile.GetValue("logpath",stargs.logpath,300);
  IniFile.GetValue("connstr",stargs.connstr,100);
  IniFile.GetValue("datapath",stargs.datapath,300);
  IniFile.GetValue("serverip",stargs.serverip,50);
  IniFile.GetValue("port",&stargs.port);
  IniFile.GetValue("online",&stargs.online);

  printf("logpath=%s\n",stargs.logpath);
  printf("connstr=%s\n",stargs.connstr);
  printf("datapath=%s\n",stargs.datapath);
  printf("serverip=%s\n",stargs.serverip);
  printf("port=%d\n",stargs.port);
  printf("online=%d\n",stargs.online);

  // 如下能夠寫更多的主程序的代碼。
}

運行效果

在這裏插入圖片描述

4、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道

若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!

相關文章
相關標籤/搜索