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

📄 rtxmlfile.cpp

📁 vc++编写的界面源代码,对C++爱好者是很发的帮助。
💻 CPP
字号:
#include "StdAfx.h"
#include "RTXmlFile.h"
#include "RTFolder.h"

CRTXmlFile::CRTXmlFile(void)
{
	m_NewPosition = -1;
}

CRTXmlFile::~CRTXmlFile(void)
{
	Clear();
}

CRTXmlItem* CRTXmlFile::GetItem(LPCTSTR lpItemName)
{
	int nCount = (int)m_ItemList.GetCount();
	for(int i = 0; i < nCount; i++)
	{
		CRTXmlItem *pItem = (CRTXmlItem *) m_ItemList.GetAt(i);
		if(pItem->ItemName == lpItemName)
			return pItem;
	}
	return NULL;
}

BOOL CRTXmlFile::Open(LPCTSTR lpFileName)
{
	if(lpFileName == NULL)return FALSE;
	m_FileName = lpFileName;
	FILE *file = fopen((LPCTSTR)m_FileName,"r");
	if(file == NULL)return FALSE;

	Clear();
	CString fileText = "";
	char buf[1025];
	while(!feof(file))
	{
		int nLen = (int)fread(buf,1,1024,file);
		if(nLen > 0)
		{
			buf[nLen] = NULL;
			fileText += buf;
		}
	}
	fclose(file);

	char *ptr = (char *)((LPCTSTR)fileText);
	while(*ptr != '\0')
	{
		if(!ParseItem(ptr,&ptr))break;
	}
	return TRUE;
}

void CRTXmlFile::AddItem(CRTXmlItem* pItem)
{
	m_ItemList.Add(pItem);
}

BOOL CRTXmlFile::Save(LPCTSTR lpSaveFile)
{
	if(lpSaveFile != NULL)m_FileName = lpSaveFile;

	CString tmpFile = m_FileName + ".tmp";
	FILE *back = fopen((LPCTSTR)m_FileName,"r");

	//创建备份文件
	if(back != NULL)
	{
		FILE *tmp = fopen((LPCTSTR)tmpFile,"w");
		if(tmp == NULL)
		{
			fclose(back);
			return FALSE;
		}

		char buf[1024];
		int nread = 0;
		while(!feof(back))
		{
			nread = (int)fread(buf,1,1024,back);
			if(nread > 0)
			{
				fwrite(buf,1,nread,tmp);
			}
		}
		fclose(back);
		fclose(tmp);
	}

	FILE *file = fopen((LPCTSTR)m_FileName,"w");
	if(file == NULL)
	{
		char path[MAX_PATH];
		CRTFolder::GetFilePath(m_FileName,path);
		if(!CRTFolder::MakeDirs(path))
			return FALSE;
		
		file = fopen(m_FileName,"w");
		if(file == NULL)return FALSE;
	}

	CRTXmlItem *pItem = GetFirstItem();
	while(pItem != NULL)
	{
		RTXmlItemData* pData = pItem->ItemData;
		char wrbuf[1024];
		ZeroMemory(wrbuf,1024);
		strcpy(wrbuf,"<");
		strcat(wrbuf,pItem->ItemName);
		fwrite(wrbuf,1,strlen(wrbuf),file);
		while(pData != NULL)
		{
			ZeroMemory(wrbuf,1024);
			strcpy(wrbuf," ");
			strcat(wrbuf,pData->KeyName);
			strcat(wrbuf,"=");
			strcat(wrbuf,pData->KeyValue);
			fwrite(wrbuf,1,strlen(wrbuf),file);
			pData = pData->Next;
		}
		ZeroMemory(wrbuf,1024);
		strcpy(wrbuf,">\r\n");
		fwrite(wrbuf,1,strlen(wrbuf),file);
		pItem = GetNextItem();
	}
	fclose(file);
	DeleteFile(tmpFile);
	return TRUE;	
}

BOOL CRTXmlFile::ParseItem(char * ptr,char** out)
{
	char * start = ptr;
	while(*start != '\0' && *start != '<')
		start++;
	if(*start == '\0')
	{
		*out = start;
		return FALSE;
	}
	start ++;
	
	if(!SkipBlank(start,&start))
	{
		*out = start;
		return TRUE;
	}
	
	char *key = start;
	if(!FindBlank(start,&start))
	{
		*out = start;
		return TRUE;
	}

	char temp = *start;
	*start = '\0';
	CRTXmlItem * pItem = new CRTXmlItem(key);
	m_ItemList.Add(pItem);
	*start = temp;

	while(SkipBlank(start,&start))
	{
		if(!ParseKey(start,pItem,&start))
			break;
		if(*start == '>')break;
	}
	*out = start;
	return TRUE;
}

BOOL CRTXmlFile::ParseKey(char* ptr,CRTXmlItem *pItem,char** out)
{
	char *start = ptr;
	char *begin = ptr;
	char *end = ptr;

	if(!FindBlank(start,&start))
	{
		return FALSE;
	}
	*out = start;
	char temp = *start;
	*start = NULL;


    while(*end != '=' && *end != '\0')
	{
		end ++;
	}
	if(end == '\0')	
	{
        *start = temp;
		return TRUE;
	}
	*end = NULL;
	end ++;
	pItem->SetKeyValue(begin,end);
	end--;
	*end = '=';
	
	*start = temp;
	return TRUE;
}

BOOL CRTXmlFile::SkipBlank(char * ptr,char ** out)
{
	char *start = ptr;
	while(*start > 0 && *start < 33)
			start ++;

	*out = start;
	if(*start == '<' || *start == '>' || *start == '\0')
		return FALSE;
	else
		return TRUE;
}

BOOL CRTXmlFile::FindBlank(char* input, char ** out)
{
	char *start = input;
	while((*start <= 0 || *start >= 33) && *start != '>' && *start != '<')
		start ++;
	
	*out = start;
	if(*start == '<' || *start == '\0')
		return FALSE;
	else
		return TRUE;
	return 0;
}

void CRTXmlFile::Clear()
{
	int nCount = (int)m_ItemList.GetCount();
	for(int i = 0; i < nCount; i++)
	{
		CRTXmlItem *pItem = (CRTXmlItem *) m_ItemList.GetAt(i);
		delete pItem;
	}
	m_ItemList.RemoveAll();
}

CRTXmlItem* CRTXmlFile::GetFirstItem()
{
	m_NewPosition = 0;
	
	if(m_ItemList.GetCount() <= 0)
		return NULL;

	return (CRTXmlItem*)m_ItemList.GetAt(m_NewPosition);
}

CRTXmlItem* CRTXmlFile::GetNextItem()
{
	m_NewPosition++;
	if(m_NewPosition > m_ItemList.GetCount() - 1)
	{
		return NULL;
	}
	return (CRTXmlItem *)m_ItemList.GetAt(m_NewPosition);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -