看到网上有很多关于读取csv文章,但是基本上都是转载一个人的,而且都有问题,明显的不能输出像截取图片那样的结果,经过自己的研究,修改了一下就可以输出了。
直接上代码
h部分
#ifndef __MGGAnalysisCSV_h__
#define __MGGAnalysisCSV_h__
#include "cocos2d.h"
USING_NS_CC;
using namespace std;
class MGGAnalysisCSV
{
public:
MGGAnalysisCSV(istream& fin = cin, string sep = ",") : fieldsep(sep), cols(0) {}
~MGGAnalysisCSV(void);
static MGGAnalysisCSV& getInstance()
{
static MGGAnalysisCSV INSTACNE;
return INSTACNE;
}
//用以存储数据
vector<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部分
#include "MGGAnalysisCSV.h"
MGGAnalysisCSV::~MGGAnalysisCSV(void)
{
for (int i=0; i<data.size(); i++)
data[i].clear();
data.clear();
}
//解析 CVS 文件
bool MGGAnalysisCSV::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)data.size());
return true;
}
void MGGAnalysisCSV::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 MGGAnalysisCSV::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 MGGAnalysisCSV::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 MGGAnalysisCSV::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;
}
//获取指定行列的数据
const char* MGGAnalysisCSV::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 MGGAnalysisCSV::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;
}
这部分是在需要调用的地方写,首先要包含头文件
#include "MGGAnalysisCSV.h"
MGGAnalysisCSV::getInstance().openFile("config/quest.csv");
for (int i=0; i<MGGAnalysisCSV::getInstance().getCols(); i++)
{
string strLine = "";
for (int j=0; j<MGGAnalysisCSV::getInstance().getRows(); j++)
{
strLine = MGGAnalysisCSV::getInstance().getData(i, j);
CCLabelTTF* pLabel = CCLabelTTF::create(strLine.c_str(), "Thonburi", 18);
pLabel->setPosition(ccp(visibleSize.width * 0.5, visibleSize.height- 90 - i * 30));
pLabel->setColor(ccc3(255, 0, 0));
this->addChild(pLabel, 100);
}
}