coco2d-x 读取csv数据表

看到网上有很多关于读取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);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值