游戏开发过程中大家经常会使用到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文件工具类的更多相关文章

  1. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  2. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  3. ios – 如何使用SwiftyJSON将字符串转换为JSON

    要转换的字符串:[{“description”:“Hi”,“id”:2,“img”:“hi.png”},{“description”:“pet”,“id”:10,“img”:“pet.png“},{”description“:”Hello!:D“,”id“:12,”img“:”hello.png“}]转换字符串的代码:varjson=JSON该字符串转换为JSON,当我尝试计算这个JSON里面有多少个块时,我得到0.打印控制台输出:0我失踪了什么帮助非常感激.解决方法实际上,在SwifyJSON中有一个内

  4. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  5. ios – 如何从Core Data创建CSV文件(swift)

    我正在构建一个带有核心数据的应用程序,它们显示在tableView中.现在我想将这些数据导出到CSV文件,这样我就可以在windows上的excel中打开它.我搜索了很多,但没有找到正确的答案.有人可以帮助我或给我一个良好的解释或教程的链接?

  6. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 05 Strings and Characters

    Swift所代表的字符串是字符串类型,进而代表字符类型的值的集合//Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。每一个字符值代表一个Unicode字符,我们可以利用for-in循环来遍历字符串中的每一个字符println}//定义一个字符常量letyenSign:Character="$"printlncharacters")//使用"countElements()"函数来获取字符串的长度//8.ConcatenatingStrings

  7. String 与 NSString 的区别

    Swift的String类型与FoundationNsstring类进行了无缝桥接。在日常开发中,绝大多数应该用StringString与Nsstring还有以下区别String类型是值类型,字符串在进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。String可以支持字符遍历Nsstring不支持String是一个结构体,性能更高;Nsstring是一个NSObject对象,性能相对会差现在还有一些功能,用String不

  8. 三 Swift学习之字符串和字符Strings and Characters

    Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。更多关于在Foundation和Cocoa中使用String的信息请查看UsingSwiftwithCocoaandObjective-C。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。所以Swift中的字符在一个字符串中并不一定占用相同的内存空间。

  9. Swift语法基础:13 - Swift的字符串字面量, 初始化字符串, 字符串可变性, 字符串是值类型

    在不同情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确您独有该字符串的值,无论它来自哪里。您可以放心您传递的字符串本身不会被更改,除非是你自己更改它。

  10. Swift语法基础:14 - Swift的字符使用, 计算数量, 连接字符串和字符, 字符串插值, 比较字符串

    如果您正在处理一个长字符串,需要注意countElements函数必须遍历字符串中的字符,以精准计算字符串的长度。Nsstring的length属性是基于利用UTF-16表示的十六位codeunits数目,而不是基于Unicode字符。为了解决这个问题,Nsstring的length属性在被Swift的String值访问时会被称为utf16count。

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部