解析文件 我们先来设计一下
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;
};