vc读取文本文件:VC读取和分析格式化文本配置文件



大多数应用都有需要配置参数配置参数保存有多种思路方法比如采用数据库保存、 2进制文件保存、格式化文本文件保存各有优缺点对于般小安全性要求不高应用推荐采用格式化文本文件保存方式这样可以节约编辑修改界面编程使用记事本编辑即可
  早期windows就是采用INI格式文本文件现在很多应用包括大型软件Software也还在采用格式化文本文件保存配置参数比如BentelyMicroStationGIS平台GEOGRAPHICS8.0
  本文给出就是利用VC来读取和分析配置文本文件这是笔者这消防监控系统远程终端软件Software使用思路方法同时给出个C类来封装配置文本文件读取分析
  下面是我采用配置文件例子包含单个参数定义表格参数定义注释:


//协议名称:TL
//工程:SQ
//配置人:JY
#DEFINE_BEGIN//以下为常量定义

//通信参数
@COM_PORT\\\\.\\COM1//COM口
@COM_BAUDRATE1200//波特率
@COM_BITSIZE8//数据位numberofbits/,4-8
@COM_STOPBIT0//0,1,2对应1,1.5,2
@COM_PARITY0//0-4对应no,odd,even,mark,space
@STATIONNO0//终端号
@TCPIP_SERVERIP192.168.0.10//服务器IP地址
@TCPIP_PORTNO3024//端口

#DEFINE_END


#TABLE_BEGIN//表格
//编号识别
//例子如下
0IonDetector,ALU1,L1S43//测量台2#离子烟感探测器报警
1ThermalDet,ALU1,L1S39//值班室温感探测器报警

#TABLE_END


语法解释:
//单行注释
#DEFINE_BEGIN单个参数定义开始标记
#DEFINE_END单个参数定义结束标记
#TABLE_BEGIN表格参数开始标记
#TABLE_END表格参数结束标记

单个参数配置:
每个参数行:以空格、TAB制表符作为分隔注释可选每行结束后有Enter键换行
表格参数配置:第列为数字编号作为ID用列和第 2列的间采用空格、TAB制表符作为分隔其他列的间采用’,’逗号、空格、TAB制表符分隔因此从第 2列起串中间夹空格是有效比如上面例子中行解释如下:
\"0\",\"IonDetector\",\"ALU1\",\"L1S43\"
同样表格参数也是每行有Enter键换行
下面给出个C类来完成这个格式文本配置读取和分析

规模:
文本文件大小:<48ks
单个参数定义个数:不限
表格参数定义:100行X4列
这些规模大小可以修改下面宏定义来满足你需要

#TABLE_MAXROW100
#TABLE_MAXCOL5//含索引ID列
typedefstruct{
nID;
chars[TABLE_MAXCOL-1][64];

}TAG_TABLEREC,*LPTABLEREC;

CDataTxt
{
public:
CDataTxt;
~CDataTxt;
CStringm_szPath;//配置文件全路经名

BOOLRead;//读入文件 [Page]
BOOLGetDefine(LPCTSTRlpszName,CString&szVal);//获取定义

//{{TABLE
TAG_TABLERECm_Table[TABLE_MAXROW];
m_nRows;
//}}
private:
charm_cbuf[1024*48];
m_nBufSize;//=1024*48;
m_nDataSize;
CStringm_szDefine;//定义段
m_nDefineLen;
CStringm_szTable;//表格段
m_nTableLen;
voidDelNote;//去掉注释
voidFormatTable(void);//规格化表格
};

CDataTxt::CDataTxt
{
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=0;
ZeroMemory(&m_Table,(m_Table));
m_nRows=0;

}
CDataTxt::~CDataTxt
{

}
BOOLCDataTxt::Read
{
CFilefl;
(!fl.Open(m_szPath,CFile::modeRead|CFile::typeBinary))
FALSE;
DWORDdwl=fl.GetLength;
(dwl>(DWORD)m_nBufSize)
dwl=(DWORD)m_nBufSize;
m_nDataSize=()(fl.Read(m_cbuf,dwl));
fl.Close;
DelNote;//去掉注释
TRUE;
}

voidCDataTxt::DelNote//去掉注释,分成定义段和表格段
{
CStringszt=\"\";
charcc,ccp=0;
i;
for(i=0;i<m_nDataSize;i)
{
cc=m_cbuf;
(cc!=’/’){sztcc;ccp=cc;}
//cc’/’
{
(i<m_nDataSize)
{
(m_cbuf[i+1]’/’)//注释开始
{
while((i<m_nDataSize)&&(m_cbuf!=0x0d))i;
(m_cbuf0x0d)i--;
ccp=0;
}
{sztcc;ccp=cc;}
}
}
}
m_nDataSize=szt.GetLength;
sprf(m_cbuf,\"%s\",szt);
ns=szt.Find(\"#DEFINE_BEGIN\",0);
ne=szt.Find(\"#DEFINE_END\",0);
((ns-1)||(ne-1));
ns13;
m_szDefine=\"\";
for(i=ns;i<ne;i)m_szDefineszt;
m_nDefineLen=m_szDefine.GetLength;
ns=szt.Find(\"#TABLE_BEGIN\",0);
ne=szt.Find(\"#TABLE_END\",0);
ns12;
((ns-1)||(ne-1));
m_szTable=\"\";
for(i=ns;i<ne;i)m_szTableszt;
m_nTableLen=m_szTable.GetLength;
FormatTable;//规格化表格
}

BOOLCDataTxt::GetDefine(LPCTSTRlpszName,CString&szVal)//获取定义


{
CStringszName=lpszName;
(szName.IsEmpty)FALSE;
nLen=szName.GetLength;
ns=m_szDefine.Find(lpszName,0);
(ns-1)FALSE;
szVal=\"\";
i=ns+nLen;
BOOLbStartCopy=FALSE;
charcc;
while(i<m_nDefineLen)
{
cc=m_szDefine;
((cc!=0x0D)&&(cc!=0x0A)&&(cc!=’\\t’)&&(cc!=0x20))
{
(bStartCopyFALSE)bStartCopy=TRUE;
szValm_szDefine;
}
{(bStartCopy);}i;
}
TRUE; [Page]
}

voidCDataTxt::FormatTable//规格化表格
{
i=0;
charcc;
nRow=0;
CStringszLine=\"\",szID=\"\",szVal=\"\",szCol=\"\";
nCol=0;
while(i<m_nTableLen)
{
cc=m_szTable;
((cc0x0A)||(cc’\\t’))cc=0x20;
(cc0X0D)//处理
{
szLine.TrimLeft;szLine.TrimRight;
(!szLine.IsEmpty)
{
nl=szLine.GetLength;
j;
charc;
szID=\"\";
for(j=0;j<nl;j)//取szID
{
c=szLine[j];
(c0x20)
;
szIDc;
}
m_Table[nRow].nID=atoi(szID);
BOOLbStart;
bStart=FALSE;
szVal=\"\";
while(j<nl)//取szCols
{
c=szLine[j];
((bStartFALSE)&&(c0x20))j;
{bStart=TRUE;szValc;j;}
}
szVal.TrimLeft;szVal.TrimRight;
nCol=0;nl=szVal.GetLength;
j=0;szCol=\"\";
while(j<nl)
{
c=szVal[j];
(c’,’)
{
(szCol.IsEmpty);

{
(nCol<TABLE_MAXCOL-1)
{
(szCol.GetLength<64)
sprf(&(m_Table[nRow].s[nCol][0]),\"%s\",szCol);
nCol;TRACE(\"szCol=%s\\n\",szCol);
}
}
szCol=\"\";
}
szColc;
j;
}
(!szCol.IsEmpty)
{
(nCol<TABLE_MAXCOL-1)
{
(szCol.GetLength<64)
sprf(m_Table[nRow].s[nCol],\"%s\",szCol);
nCol;TRACE(\"szCol=%s\\n\",szCol);
}
}
(nCol>0)
nRow;
(m_nRows>=TABLE_MAXROW)
{
m_nRows=nRow;
;
}
szLine=\"\";
}
}
szLinecc;
i;
}
m_nRows=nRow;
}

voidtest
{
CDataTxtdt;
dt.m_szPath=\"c:\\\\sqtl.txt\";
dt.Read;
CStringszVal,szMsg;
(dt.GetDefine(\"@COM_PORT\",szVal)){TRACE(\"@COM_PORT=%s\\n\",szVal);}
(dt.GetDefine(\"@COM_BAUDRATE\",szVal)){TRACE(\"@COM_BAUDRATE=%s\\n\",szVal);}
i;
for(i=0;i<dt.m_nRows;i)
{
TRACE(\"Row=%d,ID=%d,s[0]=%s,sz[1]=%s,s[2]=%s,s[3]=%s\\n\",
i,
dt.m_Table.nID,
&(dt.m_Table.s[0][0]),
&(dt.m_Table.s[1][0]),
&(dt.m_Table.s[2][0]),
&(dt.m_Table.s[3][0]));

}
}


文件读取:
voidCShotdetect::WritetoText(p1,LONGLONGp2)
{
CStringstr;
str=\"c:\\\\文本文件.txt\";
CFilefile;
file.Open(str,CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
charch_str1[30];
charch_str2[20];
_itoa(p1,ch_str1,10);
strcat(ch_str1,\",\");
_itoa(p2,ch_str2,10);
strcat(ch_str1,ch_str2);
strcat(ch_str1,\"\\n\");
length=0;
for(i=0;i<30;i)
{
(ch_str1!=’\\0’)
length;

;
}
file.SeekToEnd;
file.Write(ch_str1,length);
file.Close;

Tags:  格式化文本 vc格式化输出 vc格式化 vc读取文本文件

延伸阅读

最新评论

发表评论