程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用VC讀取和分析格式化文本配置文件

用VC讀取和分析格式化文本配置文件

編輯:vc教程

  大多數的應用程序都有需要配置的參數,配置參數的保存有多種方法,比如采用數據庫保存、二進制文件保存、格式化的文本文件保存,各有優缺點,對於一般小的安全性要求不高應用程序,推薦采用格式化文本文件保存方式,這樣可以節約編輯修改的界面編程,使用記事本程序編輯即可。

  早期的Windows就是采用的INI格式文本文件。現在很多應用程序包括大型的軟件也還在采用格式化文本文件保存配置參數,比如Bentely MicroStation GIS平台GEOGRAPHICS8.0。

  本文給出的就是利用VC來讀取和分析配置文本文件,這是筆者這消防監控系統遠程終端軟件使用的方法。同時給出一個C++類來封裝配置文本文件的讀取分析。

  下面是我采用的配置文件的例子,包含單個參數定義,表格參數定義,注釋:

// 協議名稱: TL
// 工程: SQ
// 配置人: JY
#DEFINE_BEGIN //以下為常量定義

//通信參數
@COM_PORT .COM1 //COM口
@COM_BAUDRATE 1200 //波特率
@COM_BITSIZE 8 //數據位 number of bits/byte, 4-8
@COM_STOPBIT 0 // 0,1,2 對應 1, 1.5, 2
@COM_PARITY 0 //0-4對應no,odd,even,mark,space
@STATIONNO 0 //終端號
@TCPIP_SERVERIP 192.168.0.10 //服務器IP地址
@TCPIP_PORTNO 3024 //端口

#DEFINE_END


#TABLE_BEGIN //表格
//編號 識別字符串
//例子如下
0 Ion Detector, ALU1, L1S43 //測量台2#離子煙感探測器 報警
1 Thermal Det, ALU1, L1S39 //值班室溫感探測器報警

#TABLE_END

語法解釋:
// 單行注釋
#DEFINE_BEGIN 單個參數定義的開始標記
#DEFINE_END 單個參數定義的結束標記
#TABLE_BEGIN 表格參數開始標記
#TABLE_END 表格參數結束標記

單個參數的配置:
每個參數一行:以空格、TAB制表符作為分隔,注釋可選,每行結束後有Enter鍵換行。
表格參數配置:第一列為數字編號,作為ID用,第一列和第二列之間采用空格、TAB制表符作為分隔,其他列之間采用','逗號、空格、TAB制表符分隔,因此從第二列起,字符串中間夾的空格是有效字符。比如上面例子中的第一行解釋如下:
"0","Ion Detector","ALU1","L1S43"
同樣,表格參數也是每行有Enter鍵換行。
下面給出一個C++類來完成這個格式的文本配置讀取和分析。

規模:

文本文件的大小:<48kbytes
單個參數定義個數:不限
表格參數定義: 100行 X 4列
這些規模大小可以修改下面的宏定義來滿足你的需要

#define TABLE_MAXROW 100
#define TABLE_MAXCOL 5 //含索引ID列
typedef struct{
int nID;
char s[TABLE_MAXCOL-1][64];

}TAG_TABLEREC,*LPTABLEREC;

class CDataTxt
{
public:
CDataTxt();
~CDataTxt();
CString m_szPath;//配置文件全路經名

BOOL Read();//讀入文件
BOOL GetDefine(LPCTSTR lpszName,CString &szVal);//獲取定義

//{{TABLE
TAG_TABLEREC m_Table[TABLE_MAXROW];
int m_nRows;
//}}
private:
char m_cbuf[1024*48];
int m_nBufSize;//=1024*48;
int m_nDataSize;
CString m_szDefine;//定義段
int m_nDefineLen;
CString m_szTable;//表格段
int m_nTableLen;
void DelNote();//去掉注釋
void FormatTable(void);//規格化表格
};

CDataTxt::CDataTxt()
{
int i;
m_szPath="SQTL.txt";
m_nBufSize=1024*48;
m_nDataSize=0;
m_nDefineLen=0;
m_nTableLen=0;

for(i=0;i<m_nBufSize;i++)
m_cbuf[i]=0;
ZeroMemory(&m_Table,sizeof(m_Table));
m_nRows=0;

}
CDataTxt::~CDataTxt()
{

}
BOOL CDataTxt::Read()
{
CFile fl;
if(!fl.Open(m_szPath,CFile::modeRead|CFile::typeBinary))
return FALSE;
D

[1] [2] [3] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved