Cocos2d-x之文件操作

本文详细介绍了Cocos2d-x中UserDefault的使用方法,包括存储和读取数据,并展示了如何在iOS开发中将文件拷贝到可读写路径下进行修改。同时,还介绍了如何使用rapidjson解析JSON文件,包括添加、修改和删除JSON对象的实例。

一、UserDefault

UserDefault的使用

UserDefault:Cocos2d-x自带的存储数据的类,可以存储比较小的数据。UserDefault是一个单例,我们可以通过:UserDefault::getInstance();来获得这个类的实例。UserDefault使用哈希表结构,Key-Value,Key索引,Value值。

UserDefault* hero = UserDefault::getInstance();
    hero->setStringForKey("username", "wanghang");
    hero->setBoolForKey("musicIsOn", false);
    hero->setIntegerForKey("coin", 100);
    hero->flush();
    log("%s",hero->getXMLFilePath().c_str());

数据保存在Library/Preferences/xx.xx.xx.plist中,我们通过
log("%s",UserDefault::getInstance()->getXMLFilePath().c_str());
输出的路径一直是Library/Caches/UserDefault.xml. 所以,我们通过UserDefault::getInstance()->isXMLFileExist()判断文件是否存在,我们得到的结果一直是不存在的。UserDefault保存数据没有加密,如果要加密,需要自己实现,可以使用base64等。

UserDefault的常用方法:

   UserDefault* hero = UserDefault::getInstance();
    hero->setStringForKey("username", "wanghang");
    hero->setBoolForKey("musicIsOn", false);
    hero->setIntegerForKey("coin", 100);
    hero->flush();
    log("%s",hero->getXMLFilePath().c_str());

    std::string name =  hero->getStringForKey("username");
    bool music = hero->getBoolForKey("musicIsOn");
    int coin = hero->getIntegerForKey("coin");
    log("name: %s",name.c_str());
    log("musicIsOn: %d",music);
    log("coin: %d",coin);

二、文件路径(文件拷贝到可读写文件夹下)

我们在做iOS开发时,我们应用程序里面的,也就是我们真机中的cpp文件是只读的。如果我们要修改文件,需要将文件拷贝到一个可读可写的文件夹下,然后再修改。

//获取可以写的路径
    std::string filename = "data.xml";//data.xml就是你的文件名字
    FileUtils* fu = FileUtils::getInstance();
    std::string writeAblePath = fu->getWritablePath();
    //拼接路径(documents下的路径)
    std::string xmlPath = writeAblePath+filename;
    log("%s",writeAblePath.c_str());

    if (!fu->isFileExist(writeAblePath)) {
        std::string dataPath = fu->fullPathForFilename(filename);
        std::string data = fu->getStringFromFile(data);
        FILE* file = fopen(writeAblePath.c_str(), "w");
        if (file) {
            fputs(data.c_str(), file);
            fclose(file);
        }
    }

三、rapidjson

在使用rapidjson前的准备

#include "json/rapidjson.h"
#include "json/document.h"
#include "json/writer.h"
#include "json/stringbuffer.h"
using namespace rapidjson;

我在电脑中随便找了个json类型的文件,名称为”version.json”,copy到Resources文件夹下。具体内容如下

{
    "prebuilt_libs_version":"v3-deps-31",
    "freetype":"2.5.0",
    "curl":"7.39.0",
    "jpeg":"9.0",
    "png":"1.6.2",
    "tiff":"4.0.3",
    "webp":"0.2.1",
    "websockets":"v1.23-chrome32-firefox24"
}

接下来,我们将使用rapidjson来解析这个文件,具体代码如下。(注意,在解析前,把这个json文件利用上面的方式拷贝到可读可写文件夹下。)

    //获取路径
    FileUtils* fu = FileUtils::getInstance();
    std::string writeAblePath = fu->getWritablePath();
    writeAblePath += "version.json";
    log("writer: %s",writeAblePath.c_str());
    //读取
    rapidjson::Document doc;
    std::string data = fu->getStringFromFile(writeAblePath);
    doc.Parse<rapidjson::kParseDefaultFlags>(data.c_str());
    if (doc.HasParseError()) {
        return;
    }
    if (doc.HasMember("prebuilt_libs_version")) {
        rapidjson::Value &prebuilt_libs_version = doc["prebuilt_libs_version"];
        log("prebuilt_libs_version: %s",prebuilt_libs_version.GetString());
    }
    if (doc.HasMember("freetype")) {
        rapidjson::Value &freetype = doc["freetype"];
        log("freetype :%s",freetype.GetString());
    }
    if (doc.HasMember("curl")) {
        rapidjson::Value &curl = doc["curl"];
        log("curl :%s",curl.GetString());
    }
    if (doc.HasMember("jpeg")) {
        rapidjson::Value &jpeg = doc["jpeg"];
        log("jpeg :%s",jpeg.GetString());
    }
    if (doc.HasMember("png")) {
        rapidjson::Value &png = doc["png"];
        log("png :%s",png.GetString());
    }
    if (doc.HasMember("tiff")) {
        rapidjson::Value &tiff = doc["tiff"];
        log("tiff :%s",tiff.GetString());
    }
    if (doc.HasMember("webp")) {
        rapidjson::Value &webp = doc["webp"];
        log("webp :%s",webp.GetString());
    }
    if (doc.HasMember("websockets")) {
        rapidjson::Value &websockets = doc["websockets"];
        log("websockets :%s",websockets.GetString());
    }

另外,rapidjson还提供了添加,修改和删除的方法

    //添加
    doc.AddMember("class", "nine", doc.GetAllocator());
    //修改
    doc["png"].SetString("change");
    //删除
    doc.RemoveMember("jpeg");

    rapidjson::StringBuffer buffer;//初始化缓存区
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);//初始化写入器
    doc.Accept(writer);//写入doc
    FILE* file = fopen(writeAblePath.c_str(), "wb");
    if (file) {
        fputs(buffer.GetString(), file);
        fclose(file);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值