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

📄 gppinifile.cpp

📁 用FREE BASIC做的演示程序
💻 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 + -