📄 gppinifile.cpp
字号:
/*
GGGGGGG AAA MMM MMM EEEEEEEEEEE ++++ _/_/
GG GG AA AA MMMMM MMMMM EE ++++ _/_/
GG AA AA MM MM MM MM EE ++++ _/_/
GG AA AA MM MMM MM EEEEEEEEEEE +++++++++++++++++ _/_/_/_/_/_/_/_/_/
GG AAAAAAAAAAA MM MM EEEEEEEEEEE +++++++++++++++++ _/_/_/_/_/_/_/_/_/
GG GGGGGG AA AA MM MM EE ++++ _/_/
GG GG AA AA MM MM EE ++++ _/_/
GGGGGGG AAAA AAAA MMMM MMMM EEEEEEEEEEE ++++ _/_/
Game++ Game Engine---
Game++ Studio版权所有
http://www.gamepp.org/
File:gppIniFile.h
Purpose:ini文件处理
文件格式:key=something
注意:区分大小写!
Author:Kylinx (game++Studio member)
Created Date:<2003/10/18
Last Updated by:Kylinx
Last Updated Date:2003/10/23
*/
#include<stdio.h>
#pragma warning(disable:4786)
#include"gppIniFile.h"
#include"GPacker.h"
#include"GFileLoader.h"
GIniFile::GIniFile()
{
m_pBuffer=NULL;
m_pSegBuffer=NULL;
m_pSegEnd=NULL;
m_pSegCur=NULL;
m_pCurrent=NULL;
m_pEnd=NULL;
m_dwSize=0;
}
GIniFile::~GIniFile()
{
Free();
}
void GIniFile::Free() //释放
{
if(m_pBuffer)
{
delete [] m_pBuffer;
m_pBuffer=NULL;
}
m_pSegBuffer=NULL;
m_pSegEnd=NULL;
m_pSegCur=NULL;
m_pEnd=NULL;
m_pCurrent=NULL;
m_dwSize=0;
}
bool GIniFile::SetSegment(const string & strSegName)
{
if(NULL==m_pBuffer)
return false;
m_strSegName=strSegName;
string strSeg,str;
string::iterator p;
m_pCurrent=m_pBuffer;
while(m_pCurrent<m_pEnd)
{
strSeg.erase();
str=ReadLine(m_pCurrent,m_pEnd);
p=str.begin();
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
while(p<str.end() )
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
goto _out;
if(*p!='[') //得到段的位置
goto _out;
else
{
p++; //跳过'['
break;
}
p++;
}
while(p<str.end() )//读取value
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
goto _out;
if(*p==']') //段末
{
if(strSeg==strSegName) //比较段名
{
m_pSegBuffer=m_pCurrent; //保存段首地址
m_pSegEnd=m_pCurrent;
while(m_pCurrent<m_pEnd) //找段末地址
{
if(*m_pCurrent=='[') //下一段
return true;
m_pSegEnd++;
m_pCurrent++;
}
return true;
}
}
strSeg+=*p; //得到value
p++;
}
_out:
;
}
return false;
}
string GIniFile::GetSegment()
{
return m_strSegName;
}
//读取一个ini文件到内存缓冲中
//如果pPacker不等于NULL则从pPacker中得到文件
bool GIniFile::LoadIniFileName(const string & strName,GVPacker*pPacker)
{
Free();
if(pPacker)
{
if(!pPacker->ReadPackedFile(strName,&m_pBuffer,m_dwSize))
{
return false;
}
}
else
{
ifstream ifs(strName.data(),ios::in|ios::binary);
ifs.seekg(0,ios::end);
m_dwSize=ifs.tellg();
ifs.seekg(0,ios::beg);
m_pBuffer=new char[m_dwSize]; //分配空间
if(NULL==m_pBuffer)
{
return false;
}
ifs.read(m_pBuffer,m_dwSize);
}
m_pEnd=m_pBuffer+m_dwSize;
return true;
}
bool GIniFile::LoadIniFileName(GFileLoader*pFileLoader,const string & strName)
{
assert(pFileLoader);
Free();
if(!pFileLoader->LoadFile(strName,&m_pBuffer,m_dwSize))
return false;
m_pEnd=m_pBuffer+m_dwSize;
return true;
}
bool GIniFile::IsChar(const char c)
{
if((c>='a' && c<='z')
|| (c>='A' && c<='Z'))
return true;
return false;
}
bool GIniFile::IsNum(const char c)
{
if(c>='0' && c<='9')
return true;
return false;
}
string GIniFile::ReadLine(char*&pCur,char*&pEnd)
{
string str;
while(*pCur!='\n' && pCur<pEnd) //未遇到回车并且未到文件末尾
{
str+=*pCur;
pCur++;
}
if(pCur<pEnd) //如果当前位置还没到末尾,则换行
pCur++;
return str;
}
unsigned long GIniFile::ReadDword(const string & strKeyName,unsigned long dwDefaultValue)
{
if(NULL==m_pBuffer || NULL==m_pSegBuffer)
return dwDefaultValue;
m_pSegCur=m_pSegBuffer;
string str;
string::iterator p;
string strKey,strValue;
unsigned long dwVal=dwDefaultValue;
while(m_pSegCur<m_pSegEnd)
{
strKey.erase();
strValue.erase();
str=ReadLine(m_pSegCur,m_pSegEnd);
p=str.begin();
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
while(*p!='=' && *p!=' ' && *p!='\t' && p<str.end() )
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
goto _out;
strKey+=*p; //得到key
p++;
}
if(strKey==strKeyName) //和strKeyName比较
{
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
p++; //跳过=号
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
while(*p!=' ' && *p!='\t' && p<str.end() )//读取value
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
break;
strValue+=*p; //得到value
p++;
}
sscanf(strValue.data(),"%d",&dwVal);
return dwVal;
}
_out:
;
}
return dwVal;
}
string GIniFile::ReadString(const string & strKeyName,const string & strDefaultValue)
{
if(NULL==m_pBuffer || NULL==m_pSegBuffer)
return strDefaultValue;
m_pSegCur=m_pSegBuffer;
string str;
string::iterator p;
string strKey,strValue;
string strReturn=strDefaultValue;
while(m_pSegCur<m_pSegEnd)
{
strKey.erase();
strValue.erase();
str=ReadLine(m_pSegCur,m_pSegEnd);
p=str.begin();
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
while(*p!='=' && *p!=' ' && *p!='\t' && p<str.end() )
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
goto _out;
strKey+=*p; //得到key
p++;
}
if(strKey==strKeyName) //和strKeyName比较
{
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
p++; //跳过=号
while((*p==' ' || *p=='\t')&& p<str.end()) //跳过空白部分
{
p++;
}
while(*p!=' ' && *p!='\t' && p<str.end() )//读取value
{
if(*p=='/' && p+1!=str.end() && *(p+1)=='/') //如果是注释
break;
strValue+=*p; //得到value
p++;
}
return strValue;
}
_out:
;
}
return strReturn;
}
vector<unsigned long> GIniFile::ReadDwordArray(const string & strKeyName)
{
vector<unsigned long> v;
string strArray=ReadString(strKeyName,"");
string::iterator p=strArray.begin();
string temp;
int intValue;
while(p<strArray.end())
{
temp.erase();
while(*p!=',' && p<strArray.end()) //得到string类型的一个数字
{
temp+=*p;
p++;
}
p++; //跳过逗号
sscanf(temp.data(),"%d",&intValue); //得到数字
v.push_back(intValue);
}
return v;
}
vector<string> GIniFile::ReadStringArray(const string & strKeyName)
{
vector<string> v;
string strArray=ReadString(strKeyName,"");
string::iterator p=strArray.begin();
string temp;
while(p<strArray.end())
{
temp.erase();
while(*p!=',' && p<strArray.end()) //得到string类型的一个数字
{
temp+=*p;
p++;
}
p++; //跳过逗号
v.push_back(temp);
}
return v;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -