📄 cinifile.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 + -