简单 写解析文件csv 文件操作 在写游戏时常常用到

解析文件  我们先来设计一下

csv 文件 是是一张表格   分为 行 列  如此 我们 定义俩个类 一个为解析行 一个为解析列 

设计完毕后 在看看csv 文件我什么来区分 的 用打开文本的方式打开 发现是以逗号区分 列的  "\n" 一定是区分换行  

好了 以上我们都知道了 那么就实际写代码

第一个 分割列

#pragma once
#include "cocos2d.h"
USING_NS_CC;
class Stringutil :public CCObject
{
public:
	
	static Stringutil*sharedStrUtil();
	bool init();

	//用分隔符分割 字符串  结果存放到一个列表中的对象 为CCCString

	CCArray *spilt(const char *srcStr,const char *sSep);
private:
	static Stringutil*mStringUtil;
};

Stringutil* Stringutil::mStringUtil = NULL;


Stringutil* Stringutil::sharedStrUtil()
{
	if (mStringUtil == NULL)
	{
		mStringUtil = new Stringutil;
		if (mStringUtil&&mStringUtil->init())
			mStringUtil->autorelease();
		else
		{
			delete mStringUtil;
			mStringUtil = NULL;
		}
	}

	return mStringUtil;
}

bool Stringutil::init()
{
	return true;
}
CCArray * Stringutil::spilt(const char *srcStr, const char*sSep)
{
	CCArray*stringList = CCArray::create();
	int size = strlen(srcStr);

	//将数据转换为coco2d x字符对象
	CCString *str = CCString::create(srcStr);
	int startIndex = 0;
	int ednIndex = 0;
	ednIndex = str->m_sString.find(sSep);

	CCString *spilStr = NULL;

	//根据分隔符拆分字符串  ,并添加到列表中
	while (ednIndex > 0)
	{
		spilStr = CCString::create("");
		//截取字符串
		spilStr->m_sString = str->m_sString.substr(startIndex, ednIndex);

		//添加到字串列表
		stringList->addObject(spilStr);

		//截取下一个字符串
		str->m_sString = str->m_sString.substr(ednIndex + 1, size);
		ednIndex = str->m_sString.find(sSep);
	}
	if (str->m_sString.compare("") != 0)
	{
		stringList->addObject(CCString::create(str->m_sString));
	}
	return stringList;
}

写完 第一个类后 那么在写分割行的 就简单了

#pragma once
#include "cocos2d.h"
USING_NS_CC;
class FileLoadUtil :public CCObject
{
public:
	static FileLoadUtil*sharedFileUtil();
	bool init();
	CCArray *getDataLines(const char*sFilePatch);
private:
	static FileLoadUtil *mFileLoadUtil;
};

#include "FileLoadUtil.h"
#include "Stringutil.h"

FileLoadUtil * FileLoadUtil::mFileLoadUtil = NULL;


FileLoadUtil* FileLoadUtil::sharedFileUtil()
{
	if (mFileLoadUtil == NULL)
	{
		mFileLoadUtil = new FileLoadUtil;
		if (mFileLoadUtil&&mFileLoadUtil->init())
		{
			mFileLoadUtil->autorelease();
		}
		else
		{
			delete mFileLoadUtil;
			mFileLoadUtil = NULL;
		}
	}
	return mFileLoadUtil;
}

bool FileLoadUtil::init()
{
	return true;
}

CCArray * FileLoadUtil::getDataLines(const char*sFilePatch)
{
	CCArray *linesList = CCArray::create();
	//读取文件
	unsigned long pSize = 0;
	unsigned  char*chData = CCFileUtils::sharedFileUtils()->getFileData(sFilePatch,"r",&pSize);

	//转化对象字符
	CCString*str = CCString::createWithData(chData,pSize);
	delete[]chData;

	//使用split函数分隔
	linesList = Stringutil::sharedStrUtil()->spilt(str->getCString(),"\n");

	
	return linesList;
}



写完以上俩个类 就基本完成了 一大部分解析额 
那么 接着写最后一个类'

#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class CsvUitl:public CCObject
{
public:
	
	//获取工具对象
	static CsvUitl*sharedCsvUitl();
	bool init();
	//加载文件
	void loadFile(const char*sPatch);
	//释放配置
	void releaseFile(const char*sPatch);
	//获取某行某列的值
	const char*get(int iRow, int iCol, const char*csvFilePatch);

	//获取某行某列的值 且转换为整数
	const int getInt(int iRow,int iCol,const char*csvFilePatch)
	{
		const char*chData = get(iRow, iCol, csvFilePatch);
		return atoi(chData);
	}

	//获取某行某列的值  且转换浮点型
	const float getFloat(int iRow, int iCol, const char*csvFilePatch)
	{
		const char*chData = get(iRow, iCol, csvFilePatch);
		return atof(chData);
	}
	//获取配置文件数据的行和列 数量
	const CCSize getFileRowColNum(const char*csvFilepatch);

	//根据某个列的值  查找该值所在的行
	const int findValueInWithLine(const char*chValue, int iValue, const char*csvFilePatch)
	{
		CCSize size = getFileRowColNum(csvFilePatch);
		int iLine = -1;
		for (int i = 0; i < size.width; i++)
		{
			const char*Id = get(i, iValue, csvFilePatch);
			if (!Id)
				continue;
			CCString *IDStr = CCString::createWithFormat(Id);
			if (IDStr->m_sString.compare(chValue) == 0)
			{
				iLine = i;
				break;
			}
		}
		return iLine;
	}
	

	
private:
	//工具对象 
	static CsvUitl*mCsvuitl;



	CCDictionary*mCsvDict;

};

#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class CsvUitl:public CCObject
{
public:
	
	//获取工具对象
	static CsvUitl*sharedCsvUitl();
	bool init();
	//加载文件
	void loadFile(const char*sPatch);
	//释放配置
	void releaseFile(const char*sPatch);
	//获取某行某列的值
	const char*get(int iRow, int iCol, const char*csvFilePatch);

	//获取某行某列的值 且转换为整数
	const int getInt(int iRow,int iCol,const char*csvFilePatch)
	{
		const char*chData = get(iRow, iCol, csvFilePatch);
		return atoi(chData);
	}

	//获取某行某列的值  且转换浮点型
	const float getFloat(int iRow, int iCol, const char*csvFilePatch)
	{
		const char*chData = get(iRow, iCol, csvFilePatch);
		return atof(chData);
	}
	//获取配置文件数据的行和列 数量
	const CCSize getFileRowColNum(const char*csvFilepatch);

	//根据某个列的值  查找该值所在的行
	const int findValueInWithLine(const char*chValue, int iValue, const char*csvFilePatch)
	{
		CCSize size = getFileRowColNum(csvFilePatch);
		int iLine = -1;
		for (int i = 0; i < size.width; i++)
		{
			const char*Id = get(i, iValue, csvFilePatch);
			if (!Id)
				continue;
			CCString *IDStr = CCString::createWithFormat(Id);
			if (IDStr->m_sString.compare(chValue) == 0)
			{
				iLine = i;
				break;
			}
		}
		return iLine;
	}
	

	
private:
	//工具对象 
	static CsvUitl*mCsvuitl;



	CCDictionary*mCsvDict;

};




你可能感兴趣的:(coco2dx)