cocos2d-x CSV文件读取 (Excel生成csv文件)
实现类
CCSVParse.h
#ifndef __C_CSV_PARSE__ #define __C_CSV_PARSE__ #include "cocos2d.h" #include <vector> using namespace std; class CCSVParse { public: //CCSVParse(void); ~CCSVParse(void); CCSVParse(istream& fin=cin, string sep=","): fieldsep(sep), cols(0) { } //用以存储数据 std::vector<std::vector<std::string>> data; private: string fieldsep; int cols; void StringSplit(const string& str, vector<string>& tokens, const char& delimiters); void split(vector<string>& field, string line); int advplain(const string& line, string& fld, int); int advquoted(const string& line, string& fld, int); public: bool openFile(const char* fileName); const char* getData(unsigned int rows, unsigned int cols); int findColsData(int cols, const char* value); inline int getCols(){return cols;} inline int getRows(){return data.size();}; }; #endif //__C_CSV_PARSE__
CCSVParse.cpp
#include "CSVParse.h" using namespace cocos2d; // CCSVParse::CCSVParse(void) // { // } CCSVParse::~CCSVParse(void) { } void CCSVParse::StringSplit( const string& str, vector<string>& tokens, const char& delimiters ) { string::size_type lastPos = str.find_first_not_of(delimiters, 0); string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { tokens.push_back(str.substr(lastPos, pos-lastPos)); lastPos = str.find_first_not_of(delimiters, pos); pos = str.find_first_of(delimiters, lastPos); } } void CCSVParse::split( vector<string>& field, string line ) { string fld; unsigned int i,j=0; if( line.length() ==0 ) return; i=0; do { if(j<line.length() && line[i]=='"') j = advquoted(line, fld, ++i); else j = advplain(line, fld, i); field.push_back(fld); i = j+1; } while (j<line.length()); } int CCSVParse::advplain( const string& s, string& fld, int i) { unsigned int j; j = s.find_first_of(fieldsep, i); if(j>s.length()) j=s.length(); fld = string(s,i,j-i); return j; } int CCSVParse::advquoted( const string& s, string& fld, int i) { unsigned int j; fld = ""; for (j=i; j<s.length(); ++j) { if(s[j]=='"' && s[++j]!='"') { unsigned int k = s.find_first_of(fieldsep, j); if(k>s.length()) k = s.length(); for(k-=j; k-->0;) fld += s[j++]; break; } fld += s[j]; } return j; } //解析 CVS 文件 bool CCSVParse::openFile( const char* fileName ) { string pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(fileName); unsigned char* pBuffer = nullptr; unsigned long bufferSize = 0; pBuffer = CCFileUtils::sharedFileUtils()->getFileData(pathKey.c_str(), "r", &bufferSize); string s = (char*)pBuffer; string str = s.substr(0,bufferSize); vector<string> line; StringSplit(str, line, '\n'); for(unsigned int i=0; i<line.size(); ++i) { vector<string> field; split(field, line[i]); data.push_back(field); cols = max(cols, (int)field.size()); } return true; } //获取指定行列的数据 const char* CCSVParse::getData(unsigned int rows, unsigned int cols ) { if (rows<0 || rows>=data.size() || cols<0 || cols>=data[rows].size()) { return ""; } return data[rows][cols].c_str(); } //获取指定数据的列下标 int CCSVParse::findColsData( int cols, const char* value ) { for (unsigned int i=0; i<data.size(); ++i) { if(strcmp(getData(i,cols),value)==0) return i; } return -1; }
HelloWorld.cpp 中 init() 函数中添加
CCSVParse* csvFile = new CCSVParse(); csvFile->openFile("Book1.csv"); for (int i=0; i<csvFile->getCols(); ++i) { string strLine = ""; for(int j=0; j<csvFile->getRows(); ++j) { strLine += csvFile->getData(i,j); strLine += ","; } CCLabelTTF* pLab = CCLabelTTF::create(strLine.c_str(),"Arial",20); pLab->setPosition(ccp(size.width/2,size.height-90-i*30)); this->addChild(pLab,2); }
Book1.csv 内容 注意将文件保存为UTF-8格式的(否则中文显示乱码)
星期一,1,10000,HP1,MP1,数值1,Icon1.png
星期二,2,10001,HP2,MP2,数值2,Icon2.png
星期三,3,10002,HP3,MP3,数值3,Icon3.png
星期四,4,10003,HP4,MP4,数值4,Icon4.png
星期五,5,10004,HP5,MP5,数值5,Icon5.png
星期六,6,10005,HP6,MP6,数值6,Icon6.png
星期日,7,10006,HP7,MP7,数值7,Icon7.png
win32 平台 显示结果:(保存文件 非UTF-8格式)中文显示乱码
win32 平台 显示结果:(保存文件 为UTF-8格式) 正常显示
不早了,洗洗睡吧 , 明天又起不来了
Dreams are one of those things that keep you going and happy!!!
分类:
cocos2d-x
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析