概述游戏开发过程中大家经常会使用到Csv
文件保存数据,但是我们怎么把Csv文件的数据取出来呢,今天我要向大家介绍下解析Csv用的几个
工具类 一.首先编写字符串工具类 1.h文件 #ifndef _StringUtil_H_ #define _StringUtil_H_ #include "cocos2d.h" using namespace cocos2d; using namespace std; 游戏开发过程中大家经常会使用到Csv文件保存数据,但是我们怎么把Csv文件的数据取出来呢,今天我要向大家介绍下解析Csv用的几个工具类 一.首先编写字符串工具类 1.h文件 #ifndef _StringUtil_H_ #define _StringUtil_H_ #include "cocos2d.h" using namespace cocos2d; using namespace std; class StringUtil : public Ref { public: virtual bool init(); static StringUtil * getInstance(); /* 用分隔符分割字符串,结果存放到一个列表中,列表中的对象为Value */ ValueVector split(const char * stcStr,const char * sSep); private: static StringUtil * m_StringUtil; }; #endif 2..cpp文件 #include "StringUtil.h" StringUtil * StringUtil::m_StringUtil = NulL; StringUtil * StringUtil::getInstance() { if (m_StringUtil == NulL) { m_StringUtil = new StringUtil(); if (m_StringUtil && m_StringUtil->init()) { m_StringUtil->autorelease(); m_StringUtil->retain(); } else { CC_SAFE_DELETE(m_StringUtil); m_StringUtil = NulL; } } return m_StringUtil; } bool StringUtil::init() { return true; } cocos2d::ValueVector StringUtil::split(const char * stcStr,const char * sSep) { ValueVector stringList; int size = strlen(stcStr); //将数据转换为字符串对象 Value str = Value(stcStr); int startIndex = 0; int endindex = 0; endindex = str.asstring().find(sSep); std::string linestr; //根据换行符拆分字符串,并添加到列表中 while (endindex >0) { linestr = str.asstring().substr(startIndex,endindex);//截取一行字符串 stringList.push_back(Value(linestr)); //添加到列表 str = Value(str.asstring().substr(endindex + 1,size)); //截取剩下的字符串 endindex = str.asstring().find(sSep); } //剩下的字符串也添加到列表 if (str.asstring().compare("")!= 0) { stringList.push_back(Value(str.asstring())); } return stringList; } 二.Csv文件对象类 1..h文件 #ifndef _CsvData_H_ #define _CsvData_H_ #include "cocos2d.h" using namespace cocos2d; using namespace std; class CsvData : public Ref { public: virtual bool init(); CREATE_FUNC(CsvData); voID addlineData(ValueVector lineData); //添加一行数据 ValueVector getStringlineData(int iline);//获取某行的数据 Size getRowColNum();//获取行列大小 private: //存放Csv文件所有行的数据,试试这样理解:ValueVector<Value<ValueVecctor>> ValueVector m_alllinesVec; }; #endif 2..cpp文件 #include "CsvData.h" voID CsvData::addlineData(ValueVector lineData) { m_alllinesVec.push_back(Value(lineData)); } bool CsvData::init() { return true; } cocos2d::ValueVector CsvData::getStringlineData(int iline) { return m_alllinesVec.at(iline).asValueVector(); } cocos2d::Size CsvData::getRowColNum() { Size size = Size(); size.wIDth = m_alllinesVec.size(); if (size.wIDth > 0) { size.height = m_alllinesVec.at(0).asValueVector().size(); } return size; } 三.Csv文件
读取工具类 1.h文件 #ifndef _CsvUtil_H_ #define _CsvUtil_H_ #include "cocos2d.h" #include "CsvData.h" using namespace cocos2d; using namespace std; class CsvUtil : public Ref { public: virtual bool init(); static CsvUtil * getInstance(); voID loadfile(const char * sPath);//加载配置文件 Value getValue(int iRow,int iCol,const char* csvfilePath);//获取某行某列的值 const std::string get(int iRow,const char * csvfilePath);//获取值并转换为字符串 const int getInt(int iRow,const char * csvfilePath);//获取值并转换为整型 const int getfloat(int iRow,const char * csvfilePath);//获取值并转换为小数 const int getBool(int iRow,const char * csvfilePath);//获取值并转换为布尔型 const Size getfileRowColNum(const char * csvfilePath);//获取文件的行和列数量 //根据某个列的值,查找该值所在的行 const int findValueInWithline(const char * chValue,int iValueCol,const char * csvfilePath); private: static CsvUtil * m_CsvUtil; Map<std::string,CsvData *>mCsvMap;//存放mCsvStrList-filePath的字典 }; #endif 2..cpp文件 #include "CsvUtil.h" #include "StringUtil.h" CsvUtil * CsvUtil::m_CsvUtil = NulL; CsvUtil * CsvUtil::getInstance() { if (m_CsvUtil == NulL) { m_CsvUtil = new CsvUtil(); if (m_CsvUtil && m_CsvUtil->init()) { m_CsvUtil->autorelease(); m_CsvUtil->retain(); } else { CC_SAFE_DELETE(m_CsvUtil); m_CsvUtil = NulL; } } return m_CsvUtil; } bool CsvUtil::init() { return true; } voID CsvUtil::loadfile(const char * sPath) { //存放一个Csv对象 CsvData * csvData = CsvData::create(); //读取数据,按行保存在列表中 std:: string str = fileUtils::getInstance()->getStringFromfile(sPath); ValueVector lineList = StringUtil::getInstance()->split(str.c_str(),"\n"); //把每一行的字符串拆分出来(按逗号分隔) for (auto value : lineList) { //将一行的字符串按逗号分隔,然后存放在列表,最后将列表存房贷CsvData对象里 //通俗理解,csvData将成为一个二维表格,记录了配置文件的行和列的字符串 ValueVector tArr = StringUtil::getInstance()->split(value.asstring().c_str(),","); csvData->addlineData(tArr); } //添加列表到字典里 mCsvMap.insert(sPath,csvData); } const Size CsvUtil::getfileRowColNum(const char * csvfilePath) { //取出配置文件的二维表格 auto csvData = mCsvMap.at(csvfilePath); //如果配置文件的数据不存在,则加载配置文件 if (csvData == nullptr) { loadfile(csvfilePath); csvData = mCsvMap.at(csvfilePath); } Size size = csvData->getRowColNum(); return size; } cocos2d::Value CsvUtil::getValue(int iRow,const char* csvfilePath) { auto csvData = mCsvMap.at(csvfilePath); if (csvData == nullptr) { loadfile(csvfilePath); csvData = mCsvMap.at(csvfilePath); } ValueVector rowVector = csvData->getStringlineData(iRow);//获取第iRow行的数据 Value colValue = rowVector.at(iCol);//获取iCol列数据 return colValue; } const std::string CsvUtil::get(int iRow,const char * csvfilePath) { Value colValue = getValue(iRow,iCol,csvfilePath); return colValue.asstring(); } const int CsvUtil::getInt(int iRow,csvfilePath); return colValue.asInt(); } const int CsvUtil::getfloat(int iRow,csvfilePath); return colValue.asfloat(); } const int CsvUtil::getBool(int iRow,csvfilePath); return colValue.asBool(); } 四.获取示例代码,举例用HelloWroldSence.cpp文件中的init()函数添加代码 const char * sPath = "Monster.csv";//读取csv文件 CsvUtil::getInstance()->loadfile(sPath); Value firstMonstername = CsvUtil::getInstance()->getValue(2,1,sPath); Value secMonsterHp = CsvUtil::getInstance()->getValue(3,3,sPath); int aa = CsvUtil::getInstance()->getInt(3,sPath); log("firstMonstername = %s ",firstMonstername.asstring().c_str()); log("secMonsterHp = %s",secMonsterHp.asstring().c_str()); log("aa = %d",--aa); 看下打印的消息就能知道我们具体获取的哪些数据了 总结
以上是内存溢出为你收集整理的Cocos2d-x读取Csv文件工具类全部内容,希望文章能够帮你解决Cocos2d-x读取Csv文件工具类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)