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

📄 cinifile.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏Ini文件管理模块
//CBattle.cpp
//游戏引擎中的Ini文件管理部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003-2-20 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CIniFile.h"
CIniFile::CIniFile()
{
	m_pFileBuf=NULL;
	m_pFileEnd=NULL;
	m_pCur=NULL;
	m_dwFileSize=NULL;
}
CIniFile::~CIniFile()
{
	Release();
}
BOOL CIniFile::IsNum(char c)
{
	if(c>='0' && c<='9')
		return true;
	return false;
}
BOOL CIniFile::IsChar(char c)
{
	if((c>='a' && c<='z')||(c>='A' && c<='Z'))
		return true;
	return false;
}

void CIniFile::Release()
{
	if(m_pFileBuf)
	{
		delete [] m_pFileBuf;
		m_pFileBuf=NULL;
	}
	m_pCur=NULL;
	m_pFileEnd=NULL;
	m_dwFileSize=0;
}
BOOL CIniFile::LoadFile(LPCSTR FileName)
{
	Release();
	OFSTRUCT ofs;
	HFILE hf=OpenFile(FileName,&ofs,GENERIC_READ);
	if(hf==-1)
		return false;
	m_dwFileSize=::GetFileSize((HANDLE)hf,NULL);					//得到文件长度
	_lclose(hf);

	FILE*fp=fopen(FileName,"r");
	if(!fp)
		return false;
	

	m_pFileBuf=new char[m_dwFileSize];							//从新分配内存
	if(!m_pFileBuf)
		return false;											//确保内存分配成功
	memset(m_pFileBuf,0,m_dwFileSize);
	fread(m_pFileBuf,m_dwFileSize,1,fp);						//读取数据
	fclose(fp);
	
	m_pCur=m_pFileBuf;											//使"指针"指向文件开始初
	m_pFileEnd=m_pFileBuf+m_dwFileSize;							//文件结束的"指针"
	return true;
}
 
BOOL CIniFile::GotoNextLine()
{
	if(!m_pFileBuf)
		return false;
	while(*m_pCur!='\n')
	{
		if(m_pCur>=m_pFileEnd)
			return false;
		m_pCur++;
	}
	return true;
}
 
BOOL CIniFile::GetSetName(SZ_VALUE &str)										//得到集合名字
{
	int i=0;
	INIT_STRVALUE(str);
	while(m_pCur<m_pFileEnd)
	{
		if(*m_pCur=='/' && *(m_pCur+1)=='/')
		{
			if(!GotoNextLine())
			{
				return false;
			}
			continue;
		}
		if(*m_pCur=='[')
			break;
		m_pCur++;
	}
	m_pCur++;													//跳过符号"["
	while(*m_pCur!=']' && m_pCur<m_pFileEnd)
	{
		str[i]=*m_pCur;
		i++;
		m_pCur++;
	}
	return true;
}
//作用:得到一个关键字为szKey的值,返回在value中

BOOL CIniFile::GetIntValue(char* szKey,int &value)
{
	char str[128];
	int i;
	while(m_pCur<m_pFileEnd)									//文件未结束
	{
		memset(str,0,128);
		i=0;
		if(*m_pCur=='[')										//如果下一行是另一个集合
		{
			return false;
		}
		if(*m_pCur=='/' && *(m_pCur+1)=='/')					//如果是注释
		{
			if(!GotoNextLine())
			{
				return false;									//到下一行
			}
			continue;
		}
		if(IsChar(*m_pCur))										//如果是字母
		{
			while(*m_pCur!='=')									//得到这个关键字的名字
			{
				str[i++]=*m_pCur;
				m_pCur++;
			}

			if(strcmp(szKey,str)==0)							//比较关键字,如果相同
			{
					m_pCur++;
					if(IsNum(*m_pCur))							//得到数字型关键字的值
					{
						i=0;
						memset(str,0,128);
						while(IsNum(*m_pCur))
						{
							str[i++]=*m_pCur;
							m_pCur++;
						}
						sscanf(str,"%d",&value);
						return true;
					}
					
					else										//如果是其他数据
					{
						return false;
					}
			}
			else
			{
				if(!GotoNextLine())
				{
					return false;
				}
				continue;
			}
		}
		if(*m_pCur==' '||*m_pCur=='\t' ||*m_pCur=='\n')
			m_pCur++;
		else
		{
			return false;
		}
	}
	return false;
	
}
BOOL CIniFile::GetStringValue(char* szKey,SZ_VALUE &value)
{
	char str[128];
	int i;
	while(m_pCur<m_pFileEnd)									//文件未结束
	{
		memset(str,0,128);
		i=0;
		if(*m_pCur=='[')										//如果下一行是另一个集合
		{
			return false;
		}
		if(*m_pCur=='/' && *(m_pCur+1)=='/')					//如果是注释
		{
			if(!GotoNextLine())
			{
				return false;									//到下一行
			}
			continue;
		}
		if(IsChar(*m_pCur))										//如果是字母
		{
			while(*m_pCur!='=')									//得到这个关键字的名字
			{
				str[i++]=*m_pCur;
				m_pCur++;
			}

			if(strcmp(szKey,str)==0)							//比较关键字,如果相同
			{
					m_pCur++;
					if(*m_pCur=='"')						//得到字符型关键字的值
					{
						i=0;
						memset(str,0,128);
						m_pCur++;
						while(*m_pCur!='"')
						{
							str[i++]=*m_pCur;
							m_pCur++;
						}
						strcpy(value,str);
						return true;
					}
					else										//如果是其他数据
					{
						return false;
					}
			}
			else
			{
				if(!GotoNextLine())
				{
					return false;
				}
				continue;
			}
		}
		if(*m_pCur==' '||*m_pCur=='\t' ||*m_pCur=='\n')
			m_pCur++;
		else
		{
			return false;
		}
	}
	return false;
	
}
BOOL CIniFile::GetStringValueInSet(char* szSet,char* szKey,SZ_VALUE&value)
{
	if(!m_pFileBuf)
		return false;

	m_pCur=m_pFileBuf;						//重新把"文件指针"定位到开始处
	SZ_VALUE tmp;
	INIT_STRVALUE(tmp);
	INIT_STRVALUE(value);
	while(m_pCur<m_pFileEnd)				//文件未结束时
	{
		if(!GetSetName(tmp))
			return false;					//得到集合名字

		if(strcmp(tmp,szSet)==0)			//如果是Set集合
		{
			if(!GotoNextLine())
			{
				return false;
			}
			else
			{
				return GetStringValue(szKey,value);	//返回关键字szKey的值
			}
		}
	}
	return false;
}
BOOL CIniFile::GetIntValueInSet(char* szSet,char* szKey,int &value)
{
	if(!m_pFileBuf)
		return false;

	m_pCur=m_pFileBuf;						//重新把"文件指针"定位到开始处
	SZ_VALUE str;
	INIT_STRVALUE(str);
	while(m_pCur<m_pFileEnd)				//文件未结束时
	{
		if(!GetSetName(str))
			return false;					//得到集合名字

		if(strcmp(str,szSet)==0)			//如果是Set集合
		{
			if(!GotoNextLine())
			{
				return false;
			}
			else
			{
				return GetIntValue(szKey,value);	//返回关键字szKey的值
			}
		}
	}
	return false;
}

⌨️ 快捷键说明

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