(4)cocos2dx读取csv数据文件

cocos2dx中读取数据文件可能有很多种,像读取xml,lua,csv,json等,这些都可以作为配置数据的格式。

最近用到了读取csv数据文件,所以在网上找了一下关于这方面的技术博客。果然,网上各路大神都是不吝啬的,

不说废话了,直接上代码。代码如下(测试通过,可读取数据):

.h头文件

//
//  QLCSVFile.h
//
//  Created by quasi_lee on 15-7-7.
//
//

#ifndef __QLCSVFile__
#define __QLCSVFile__

#include <stdio.h>
#include "cocos2d.h"

USING_NS_CC;
using namespace std;

class QLCSVFile {
public:
    QLCSVFile();
    ~QLCSVFile();

    //用以存储数据
    vector<vector<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:
    //打开CSV文件
    bool openFile(const char*fileName);
    //根据行列获取数据
    const char* getData(int rows,int cols);
    //获取指定数据的列下标
    int findColsData(int cols,const char* value);
    //得到总列数
    inline int getCols(){return cols;}
    //得到总行数
    inline int getRows(){return data.size();}
};

#endif /* defined(__QLCSVFile__) */

.cpp文件

//
//  QLCSVFile.cpp
//
//  Created by quasi_lee on 15-7-7.
//
//

#include "QLCSVFile.h"

QLCSVFile::QLCSVFile()
: fieldsep(",")
, cols(0)
{

}

//获取指定行列的数据
const char* QLCSVFile::getData(int rows, int cols)
{
    if(rows < 0
       || rows >= data.size()
       || cols < 0
       || cols >= data[rows].size())
    {
        return "";
    }
    return data[rows][cols].c_str();
}

//获取指定数据的列下标
int QLCSVFile::findColsData(int cols, const char *value)
{
    for(int i = 0; i < data.size(); i++)
    {
        if(strcmp(getData(i, cols), value) == 0)
        {
            return i;
        }
    }
    return -1;
}

//解析CSV文件
bool QLCSVFile::openFile(const char *fileName)
{
    string pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(fileName);
    unsigned char* pBuffer = NULL;
    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(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;
}

void QLCSVFile::StringSplit(const std::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 QLCSVFile::split(vector<string>& field,string line)
{
    string fld;
    int i = 0;
    int j = 0;

    if(line.length() == 0)
    {
        return;
    }

    do {
        if(i < 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 QLCSVFile::advquoted(const string &line, string &fld, int i)
{
    int j = 0;
    fld = "";
    for(j = i; j < line.length(); j++)
    {
        if(line[j] == '"'
           && line[++j] != '"')
        {
            int k = line.find_first_of(fieldsep, j);
            if(k > line.length())
            {
                k = line.length();
            }
            for(k -= j; k-- > 0; )
            {
                fld += line[j++];
            }
            break;
        }
        fld += line[j];
    }
    return j;
}

int QLCSVFile::advplain(const string &line, string &fld, int i)
{
    int j = 0;
    j = line.find_first_of(fieldsep, i);
    if(j > line.length())
    {
        j = line.length();
    }
    fld = string(line, i, j - i);
    return j;
}

//析构函数,释放内存
QLCSVFile::~QLCSVFile()
{
    for(int i = 0; i < data.size(); i++)
    {
        data[i].clear();
    }
    data.clear();
}

代码下载地址:http://download.csdn.net/detail/u010170012/8911095

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 17:30:42

(4)cocos2dx读取csv数据文件的相关文章

Java读取CSV数据并写入txt文件

读取CSV数据并写入txt文件 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import com.csvreader.CsvReader; /****************************************************************************

Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

PRM 全称为ParnassusData Recovery Manager ,由 诗檀软件自主研发,拥有独立的软件著作权. PRM可以独立于Oracle软件运行,直接从Oracle数据文件中抽取表上的数据. 当以下几种场景中,都可以用上PRM: 无备份或者备份不可用情况下,数据表被意外truncate掉或者DROP掉 由于数据库损坏,导致的数据打不开 无法OPEN 数据块存在损坏,Oracle无法读取出数据 数据文件存在损坏,或者数据文件头信息不一致 等等 以上这些问题中,用户均可以考虑使用PR

android平台 cocos2d-x 读取相册数据

现已解决 方案如下:1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取JAVA代码如下:    //启动图片选择框      private void launchCamera()      {          // TODO Auto-generated method stub          Intent intent = new Intent();          intent.setType

matlab读取二进制数据文件的方法

matlab可以直接读取二进制数据文件,并且可以将其加入到矩阵中. 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,幸运的是在matlab中仍然可以使用这些函数来读入实验数据. 现在假定有一个数据文件叫data.dat,它的前面2k是存放参数的,我们做数据处理的时候 需要跳过去,后面的数据是16位整数类型的,每组数据有512个.现在要把该数据文件的 所有数据读入一个nx512的矩阵中,n的个数不定,根据数据

cocos2d-x 读取CSV文件,读取本地Excel配置表的方法

//CSVReader.h #define MAP_LINE std::map<std::string, std::string> //key为首行字符串, value为此列字符串 #define MAP_CONTENT std::map<int, MAP_LINE> //key为code, value为一行map #define VEC_MAP std::vector<std::pair<std::string, int>> //csv文件读取器 clas

PHP读取CSV大文件导入数据库的示例

对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指定的某几行数据: /** * csv_get_lines 读取CSV文件中的某几行数据 * @param $csvfile csv文件路径 * @param $lines 读取行数 * @param $offset 起始行数 * @return array * */ function csv_get

PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)

CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题. 1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行:办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能:办法三:借助SplFileObject类,直接将指针定位到文件末尾,通过SplFileObject::key方法获取总行数,这种办

PHP读取CSV大文件导入数据库

PHP如何对CSV大文件进行读取并导入数据库? 对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指定的某几行数据: /**  * csv_get_lines 读取CSV文件中的某几行数据  * @param $csvfile csv文件路径  * @param $lines 读取行数  * @param $offset 起始行数  * @retur

C#读取csv格式文件

一.CSV文件规则 1 开头是不留空,以行为单位. 2 可含或不含列名,含列名则居文件第一行. 3 一行数据不跨行,无空行. 4 以半角逗号(即,)作分隔符,列为空也要表达其存在. 5 列内容如存在半角逗号(即,)则用半角引号(即',')将该字段值包含起来. 6 列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来. 7 文件读写时引号,逗号操作规则互逆. 8 内码格式不限,可为 ASCII.Unicode