📄 nuq_parse.cpp
字号:
// NUQ_Parse.cpp: implementation of the CNUQ_Parse class.
//
//////////////////////////////////////////////////////////////////////
#include "../stdafx.h"
#include "NUQ_Parse.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//##ModelId=429FFD4C0242
CNUQ_Parse::CNUQ_Parse()
{
m_Fields.RemoveAll();
m_Values.RemoveAll();
m_szL[0] = '\0';
m_szR[0] = '\0';
m_strParseString = "";
m_unMaxLen = 0;
m_unCurPos = 0;
m_strStart = "";
m_strEnd = "";
m_strItemString = "";
}
//##ModelId=429FFD4C0243
CNUQ_Parse::~CNUQ_Parse()
{
m_Fields.RemoveAll();
m_Values.RemoveAll();
m_szL[0] = '\0';
m_szR[0] = '\0';
}
//##ModelId=429FFD4C0293
BOOL CNUQ_Parse::FindItem(char *pszData, UINT unMaxLen,
const CString &strStart, const CString &strEnd,
CString &strField, UINT &unPos)
{
INT nslen = strStart.GetLength();
INT nelen = strEnd.GetLength();
INT nfpos = 0;
INT nspos = 0;
BOOL bfind= FALSE;
for (UINT i=0;i < unMaxLen;i++)
{
if (0 == memcmp(pszData + i,(char*)(LPCSTR)strStart,nslen))
{//Find
nfpos = i;
bfind = TRUE;
break;
}
}
if (!bfind) return FALSE;
bfind = FALSE;
nfpos += nslen;
for (i = nfpos;i < unMaxLen;i++)
{
if (0 == memcmp((char*)(pszData + i),(char*)(LPCSTR)strEnd,nelen))
{//Find
nspos = i;
bfind = TRUE;
break;
}
}
if (!bfind) return FALSE;
//<out>获取内容
pszData[nspos] = '\0';
strField = (pszData + nfpos);
unPos = nspos;
return TRUE;
}
//##ModelId=429FFD4C0290
BOOL CNUQ_Parse::ParseItem(const CString& strInfo)
{
INT nposl = 0;
INT nposr = 0;
char cb = '\0';
char ccur = '\0';
INT nlen = 0;
strcpy(m_szR,(LPCSTR)strInfo);
nlen = strlen(m_szR);
m_Fields.RemoveAll();
m_Values.RemoveAll();
m_szL[0] = '\0';
CString str = "";
for (INT i=0;i<nlen;i++)
{
ccur = m_szR[i];
if (' ' == ccur && '\0' == cb)
{//cb == '\0' 说明此时的空格可以舍弃
continue;
}
else if ('=' == ccur && '\0' == cb)
{ //当前为 =号,左侧字符串放入Field
str = m_szL;
cb = '\0';
m_Fields.Add(str);
m_szL[0] = '\0';
nposl = 0;
continue;
}
else if ('\"' == ccur)
{
if ('\"' == cb) //放入Value
{//当前是双引号,且为右引号,这是数值了
str = m_szL;
cb = '\0';
m_Values.Add(str);
m_szL[0] = '\0';
nposl = 0;
continue;
}
else
{//当前是双引号,且为第一个引号,开始计数
m_szL[0] = '\0';
nposl = 0;
cb = '\"';
continue;
}
}
else
{//其他符号,放入左侧字符串
m_szL[nposl] = ccur;
nposl ++;
m_szL[nposl] = '\0';
}
}
return TRUE;
}
/*****************************************************************
** 函数名: GetValue
** 输 入: strField:键名
** 输 出: 键值
** 功能描述: 根据输入的键名找出相应的键值
** 全局变量:
** 调用模块:
** 作 者: 冯艳硕
** 日 期: 2004年05月12日
** 修 改:
** 版本: 1.0.0
****************************************************************/
//##ModelId=429FFD4C0281
CString CNUQ_Parse::GetValue(const CString &strField)
{
INT nnum = m_Fields.GetSize();
for (INT i=0;i<nnum;i++)
{
if (strField == m_Fields.GetAt(i))
{//<out>找到这个字段了
INT nv = m_Values.GetSize();
if (i < nv) //有效字段
{
return CString(m_Values.GetAt(i));
}
else
{
return CString("");
}
}
}
return CString("");
}
/*****************************************************************
** 函数名: GetDate
** 输 入: strDate字符串型的日期;
** pTm struct [out]tm型的日期
** 输 出: TRUE 成功;
** 功能描述:修改指定节目
** 全局变量:
** 调用模块:
** 作 者: 冯艳硕
** 日 期: 2002-04-30
** 修 改:
** 版本: 2.0.0
****************************************************************/
//<func_start>
//##ModelId=429FFD4C02B2
BOOL CNUQ_Parse::GetDate(const CString strDate,CTime & Time)
//<func_end>
{
//-----------------把字符串转换为时间类型------------------------
//<note_start>
CString strSrc=strDate;
char * pszTmp;
int i=0,j=0;
INT nyear = 2000;
INT nmonth = 0;
INT nday = 0;
INT nhour = 0;
INT nminute = 0;
INT nsecond = 0;
//--------get year----------------------
//<note>操作年
i=strSrc.Find("-",0);
if (i<=0) return FALSE;
CString strCurUnit=strSrc.Left(i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nyear = atoi(pszTmp);
//--------get month---------------------
//<note>操作月
i++;
j=strSrc.Find("-",i);
if (j<=0) return FALSE;
strCurUnit=strSrc.Mid(i,j-i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nmonth = atoi(pszTmp);
//--------must sub 1
//--------get day-----------------------
//<note>操作日
i=j;i++;
j=strSrc.Find(" ",i);
if (j<=0) return FALSE;
strCurUnit=strSrc.Mid(i,j-i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nday = atoi(pszTmp);
//--------get hour-----------------------
//<note>操作小时
i=j;i++;
j=strSrc.Find(":",i);
if (j<=0) return FALSE;
strCurUnit=strSrc.Mid(i,j-i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nhour = atoi(pszTmp);
//--------get min-----------------------
//<note>操作分
i=j;i++;
j=strSrc.Find(":",i);
if (j<=0) return FALSE;
strCurUnit=strSrc.Mid(i,j-i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nminute = atoi(pszTmp);
//--------get sec-----------------------
//<note>操作秒
i=j;i++;
strCurUnit=strSrc.Right(strSrc.GetLength()-i);
pszTmp=(char *)(LPCSTR)strCurUnit;
nsecond = atoi(pszTmp);
Time = CTime(nyear,nmonth,nday,nhour,nminute,nsecond);
return TRUE;
//<note_end>
}
/*****************************************************************
** 函数名: FileToString
** 输 入: strFile:文件路径名;
** 输 出: 转化后的字符串;
** 功能描述:将一个本地文件内容转化成字符串
** 全局变量:
** 调用模块:
** 作 者: 冯艳硕、李焱
** 日 期: 2004-05-12
** 修 改:
** 版本: 2.0.0
****************************************************************/
//##ModelId=429FFD4C0273
CString CNUQ_Parse::FileToString(const CString &strFile)
{
CString strret = "";
CFile f;
f.m_hFile = NULL;
if (f.Open(strFile,CFile::modeRead
|CFile::typeBinary))
{
f.SeekToBegin();
INT nlen = (INT)f.SeekToEnd();
char * p = NULL;
p = new char[nlen + 10];
if (NULL != p)
{
//<out>读取文件内容到内存
f.SeekToBegin();
INT npos = 0;
INT nread= 0;
// do
// { //<out>读取数据
nread = f.Read(p + npos,nlen);
npos += nread;
// }while(nread > 0);
p[npos] = '\0';
//<out>把无效的字符变更为空格
BYTE byV = 0;
for (INT i=0;i<npos;i++)
{
byV = (BYTE)p[i];
if (byV < 0x20 && byV >= 0) p[i] = 0x20;
}
strret = p;
//<out>删除申请的内存
delete []p;
p = NULL;
}
f.Close();
}
return CString(strret);
}
/*****************************************************************
** 函数名: FindItemEx
** 输 入: strStart:开始标识符;strEnd:结束标识符
** 输 出: 如果寻找字符串成功则返回VCON_RESULT_OK,否则返回VCON_RESULT_OK
** 功能描述: 将具有开始和结束标志的字符串找到并解析
** 全局变量:
** 调用模块: ParseItemEx(const CString &strInfo)
** 作 者: 冯艳硕、李焱
** 日 期: 2004年05月12日
** 修 改:
** 版本: 1.0.0
****************************************************************/
//##ModelId=429FFD4C0263
INT CNUQ_Parse::FindItemEx(const CString &strStart, const CString &strEnd)
{
if("" == m_strParseString) return VCON_RESULT_ERROR;
if(0 == m_unMaxLen) return VCON_RESULT_ERROR;
if("" != strStart && "" != strEnd)
{
m_strStart = strStart;
m_strEnd = strEnd;
}
if("" == m_strStart && "" == m_strEnd) return VCON_RESULT_ERROR;
char *pszData = (char*)(LPCSTR)m_strParseString;
pszData += m_unCurPos;
//<out>add by fys
UINT unMaxLen = m_unMaxLen - m_unCurPos;
CString strField = "";
INT nslen = m_strStart.GetLength();
INT nelen = m_strEnd.GetLength();
INT nfpos = 0;
INT nspos = 0;
BOOL bfind= FALSE;
for (UINT i=0;i < unMaxLen;i++)
{
if (0 == memcmp(pszData + i,(char*)(LPCSTR)m_strStart,nslen))
{//Find
nfpos = i;
bfind = TRUE;
break;
}
}
if (!bfind) return VCON_RESULT_ERROR;
bfind = FALSE;
nfpos += nslen;
for (i = nfpos;i < unMaxLen;i++)
{
if (0 == memcmp((char*)(pszData + i),(char*)(LPCSTR)m_strEnd,nelen))
{//Find
nspos = i;
bfind = TRUE;
break;
}
}
if (!bfind) return VCON_RESULT_ERROR;
//<out>获取内容
INT nlen = nspos - nfpos;
if (nlen <= 0) return VCON_RESULT_ERROR;
CString strTemp = pszData;
strField = strTemp.Mid(nfpos,nlen);
//<out>保存整个字符串
m_strItemString = strField; //strTemp.Mid(nfpos-nslen,nlen+nslen+nelen);
//-------------------------------------------------------------------
m_unCurPos += nspos + 1;
if(VCON_RESULT_OK != ParseItemEx(strField)) return VCON_RESULT_ERROR;
return VCON_RESULT_OK;
}
/*****************************************************************
** 函数名: SetParseString
** 输 入: strParse:将要解析的字符串
** 输 出: 无
** 功能描述: 在解析字符串之前先调用它进行初始化
** 全局变量:
** 调用模块:
** 作 者: 李焱
** 日 期: 2004年05月12日
** 修 改:
** 版本: 1.0.0
****************************************************************/
//##ModelId=429FFD4C0261
void CNUQ_Parse::SetParseString(const CString &strParse)
{
m_strParseString = strParse;
// _DelInvalidChar();
m_unMaxLen = m_strParseString.GetLength();
m_unCurPos = 0;
m_strItemString = "";
}
//##ModelId=429FFD4C0252
BOOL CNUQ_Parse::ParseItemEx(const CString &strInfo)
{
INT nposl = 0;
INT nposr = 0;
char cb = '\0';
char ccur = '\0';
INT nlen = 0;
strcpy(m_szR,(LPCSTR)strInfo);
nlen = strlen(m_szR);
m_Fields.RemoveAll();
m_Values.RemoveAll();
m_szL[0] = '\0';
INT nspacepos = 0;
CString strtmp = "";
CString str = "";
for (INT i=0;i<nlen;i++)
{
ccur = m_szR[i];
if (' ' == ccur && '\0' == cb)
{//cb == '\0' 说明此时的空格可以舍弃
m_szL[nposl] = ccur;
nposl ++;
m_szL[nposl] = '\0';
}
else if ('=' == ccur && '\0' == cb)
{ //当前为 =号,左侧字符串放入Field
str = m_szL;
//<out>处理 出现的空格
str.TrimLeft();
str.TrimRight();
nspacepos = str.ReverseFind(' ');
if (nspacepos > 0)
{
strtmp = str.Mid(nspacepos+1);
str = strtmp;
}
cb = '\0';
m_Fields.Add(str);
m_szL[0] = '\0';
nposl = 0;
continue;
}
else if ('\"' == ccur)
{
if ('\"' == cb) //放入Value
{//当前是双引号,且为右引号,这是数值了
str = m_szL;
cb = '\0';
m_Values.Add(str);
m_szL[0] = '\0';
nposl = 0;
continue;
}
else
{//当前是双引号,且为第一个引号,开始计数
m_szL[0] = '\0';
nposl = 0;
cb = '\"';
continue;
}
}
else if(ccur > 0 && (ccur < 48 || ccur > 122) && '\0' == cb)
{//舍弃无关字符
continue;
}
else
{//其他符号,放入左侧字符串
m_szL[nposl] = ccur;
nposl ++;
m_szL[nposl] = '\0';
}
}
return VCON_RESULT_OK;
}
void CNUQ_Parse::_DelInvalidChar()
{
//<out>把无效的字符变更为空格
BYTE byV = 0;
char * p = m_strParseString.GetBuffer(0);
INT npos = m_strParseString.GetLength();
for (INT i=0;i<npos;i++)
{
byV = (BYTE)p[i];
if (byV < 0x20 && byV >= 0) p[i] = 0x20;
}
}
CString CNUQ_Parse::GetItem()
{
CString str;
str.Format("%s %s %s",m_strStart,m_strItemString,m_strEnd);
return CString(str);
}
CString CNUQ_Parse::GetField()
{
return m_strItemString;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -