⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nuq_parse.cpp

📁 通过vc++语言编写的一个界面程序,主要完成IP地址的链接和网页的打开
💻 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 + -