Cocos2d-x学习笔记之数据存取方式

来源:互联网 发布:51单片机读取sd卡视频 编辑:程序博客网 时间:2024/05/16 03:42
//
//  FilesScene.cpp
//  Demo02
//
//  Created by Neworigin on 17/8/21.
//
//


#include "FilesScene.hpp"
Scene* FilesScene::createScene(){
    auto scene = Scene::create();
    auto layer = FilesScene::create();
    scene->addChild(layer);
    return scene;
}




bool FilesScene::init(){
    if(!Layer::init()){
        return false;
    }
    
    //addUserDefault();
    //getFilePath();
   parseJson();


   // parseXML();
    return true;
}
//userDefault
void FilesScene::addUserDefault(){
    //获取单例
    auto userDefault = UserDefault::getInstance();
    
    
    //设置int类型的数据
    userDefault->setIntegerForKey("keyI", 10);
    //读取int类型的数据 如果Key不存在 返回传入的默认参数   若存在返回key值对应的value
    auto keyI = userDefault->getIntegerForKey("keyI",100);
    CCLOG("KeyI = %d",keyI);


    auto key = userDefault->getIntegerForKey("key = %d",12);
    CCLOG("key = %d",key);
    
    
    //设置bool类型的数据
    userDefault->setBoolForKey("keyB", true);
    auto keyB = userDefault->getBoolForKey("keyB");
    CCLOG("keyB = %d",keyB);


    
      //设置double类型的数据
    userDefault->setDoubleForKey("keyD", 3.33);
    auto keyD = userDefault->getDoubleForKey("keyD");
    CCLOG("keyD = %lf",keyD);
    
    
      //设置String类型的数据
    userDefault->setStringForKey("keyS", "hello");
    auto keyS = userDefault->getStringForKey("keyS");
    CCLOG("keyS = %s",keyS.c_str());
    
    
    //设置float类型的数据
    userDefault->setFloatForKey("keyF",4.3336);
    auto keyF = userDefault->getFloatForKey("ketF");
    CCLOG("keyF = %f",keyF);
    
    
    
    //获取文件路径
    auto path = userDefault->getXMLFilePath();
    CCLOG("path = %s",path.c_str());
    //判断文件是否存在
    if(!userDefault->isXMLFileExist()){
        CCLOG("文件不存在!");
    }




}


//获取文件
void FilesScene::getFilePath(){
    //获取文件路径单例类
    auto fu = FileUtils::getInstance();
    //获取可写文件路径
    auto writePath = fu->getWritablePath();
    CCLOG("writePath:%s",writePath.c_str());
    //路径拼接
    writePath += "data.txt";
    //判断文件路径是否存在
    if(!fu->isFileExist(writePath)){
        //获取资源文件路径
        auto filePath = fu->fullPathForFilename("data.txt");
        //获取文件内容
        auto fileData = fu->getStringFromFile(filePath);
        //以写的方式打开文件
        auto file = fopen(writePath.c_str(),"w");
        //判断文件是否打开成功
        if(file){
            //写入数据
            fputs(fileData.c_str(), file);
            //清空缓存
            fflush(file);
            //关闭文件
            fclose(file);
        }else{
            CCLOG("打开文件失败");
            return;
        }
    }else{
        auto file = fopen(writePath.c_str(),"w");
        if(file){
            fputs("hello", file);
            fclose(file);
        }else{
            return;
        }
    }
    
    //读取可写文件内容
    auto data = fu->getStringFromFile(writePath);
    CCLOG("data:%s",data.c_str());
    
}


//json
void FilesScene::parseJson(){
    //获取路径
    auto fileUtils = FileUtils::getInstance();
    //获取可写文件路径
    auto writePath = fileUtils->getWritablePath();
    //路径拼接
    writePath += "Data2.json";
    //判断可写文件路径是否存在
    if(!fileUtils->isFileExist(writePath)){
        //拷贝文件内容
        //获取资源文件路径
        auto filePath = fileUtils->fullPathForFilename("data.json");
        //获取文件内容
        auto fileData = fileUtils->getStringFromFile(filePath);
        //打开可写文件路径
        auto file = fopen(writePath.c_str(),"w");
        //判断打开文件是否成功
        if(file){
            //向可写文件  写入数据
            fputs(fileData.c_str(), file);
            //清空缓存
           fflush(file);
            //关闭可写文件
            fclose(file);
        }
    }
    
    //获取可写文件内容
    auto data = fileUtils->getStringFromFile(writePath);
      CCLOG("data:%s",data.c_str());
    
    //解析
    Document doc;
    //解析字符串<解码格式 通常使用默认的解码格式>
    doc.Parse<rapidjson::kParseDefaultFlags>(data.c_str());
    //判断解析是否成功
    if(doc.HasParseError()){
       CCLOG("解析出错");
        return;
    }
    
    //判断元素user是否存在
    if(doc.HasMember("user")){
        rapidjson::Value& user = doc["user"];
        //判断是否是数组
        if(user.IsArray()){
            rapidjson::Value& user_1 = user[1];
            //判断是否是对象
            if(user_1.IsObject()){
                rapidjson::Value& name = user_1["name"];
                //获取name的值
                CCLOG("name = %s",name.GetString());
                
                rapidjson::Value& password = user_1["password"];
                //获取Int类型的值
                CCLOG("password:%d",password.GetInt());
            }
        }
    
    }
    
    rapidjson::Value& weaponName = doc["weapon"][0]["name"];
   CCLOG("name=%s",weaponName.GetString());
   
    
    
    
  CCLOG("writePath:%s",writePath.c_str());
    
    //初始化缓冲区
    rapidjson::StringBuffer buffer;
    //初始化写入器
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    //写入doc
    doc.Accept(writer);
    //打开可写文件
    FILE* file = fopen(writePath.c_str(),"wb");
    if(file){
        fputs(buffer.GetString(),file);
        fclose(file);
    }
    /*
    //添加成员(key值,value值)
    doc.AddMember("name","name",doc.GetAllocator());
     rapidjson::Value& user = doc["user"][0];
    user.AddMember("name","new",doc.GetAllocator());
    */
    
    //修改
   // doc["user"][1]["password"].SetInt(111111);
    
    //删除
   // doc.RemoveMember("name");
    
}




//xml
void FilesScene::parseXML(){
    auto fileUtils = FileUtils::getInstance();
    auto writePath = fileUtils->getWritablePath();
    writePath += "test2.xml";
    
    //判断文件是否存在
    if(!fileUtils->isFileExist(writePath)){
        //拷贝内容
        auto filePath = fileUtils->fullPathForFilename("test.xml");
        //获取资源文件的内容
        auto fileData = fileUtils->getStringFromFile(filePath);
        //打开可写文件
        auto file = fopen(writePath.c_str(), "w");
        //
        if(file){
            fputs(fileData.c_str(), file);
            fclose(file);
        }
    }
    
    auto data = fileUtils->getStringFromFile(writePath);
    CCLOG("data:%s",data.c_str());
    
    //加载文档
    tinyxml2::XMLDocument* doc = new XMLDocument();
    //获取错误返回码
    XMLError errorID = doc->LoadFile(writePath.c_str());
    //判断解析是否成功
    if(errorID!=0){
        CCLOG("解析失败");
        delete doc;
        return;
    }
    
    //获取根节点
    XMLElement* root = doc->RootElement();
    CCLOG("rootKey:%s",root->Value());
    CCLOG("rootValue:%s",root->GetText());
    //获取第一个子节点
    XMLElement* user = root->FirstChildElement();
    CCLOG("userKey:%s",user->Value());
    CCLOG("userValue:%s",user->GetText());
    
    //获取admin
    XMLElement* admin1 = user->FirstChildElement();
    CCLOG("admin1Key:%s",admin1->Value());
    CCLOG("admin1Value:%s",admin1->GetText());
    //获取admin的下一个节点
    XMLElement* admin2 = admin1->NextSiblingElement();
    CCLOG("admin2Key:%s",admin2->Value());
    CCLOG("admin2Value:%s",admin2->GetText());
    
    //获取name
    XMLElement* name = admin2->FirstChildElement();
    CCLOG("nameKey:%s",name->Value());
    CCLOG("nameValue:%s",name->GetText());
    
    //获取密码 root->user->admin->name->passwpord
    XMLElement* password = doc->RootElement()->FirstChildElement()->FirstChildElement()->FirstChildElement()->NextSiblingElement();
    CCLOG("passwordKey:%s",password->Value());
    CCLOG("passwordValue:%s",password->GetText());
/*
    //添加节点
    XMLElement* newNode = doc->NewElement("AGE");
    //新键内容
    auto text = doc->NewText("1111111");
    //将内容添加到标签内
    newNode->LinkEndChild(text);
    //给标签设置属性  标记
    newNode->SetAttribute("info", "the pid");
    //添加标签
    user->LinkEndChild(newNode);
    //保存修改
    doc->SaveFile(writePath.c_str());
   */
    
    /*
     //修改节点
    XMLNode* oldNode = user->FirstChild()->NextSibling()->NextSibling();
    CCLOG("oldNode=%s",oldNode->Value());
    oldNode->SetValue("NODE");
    //保存修改
    doc->SaveFile(writePath.c_str());
    */
    
    /*
    //删除
    XMLElement* deleteNode = admin2->NextSiblingElement();
    //删除子节点
    user->DeleteChild(deleteNode);
    doc->SaveFile(writePath.c_str());
    */
    
}



原创粉丝点击