Cocos2d-x操作:文件读取导致闪退


问题1:fopen
在vs下使用fopen进行文件处理,跑通了,但是移植到android下时就出现了一大推问题,首先需要理解的是在vs下开发资源是存放在执行文件的相同目录下的,而移植到android下时资源是存放在assets目录下的,之前尝试过使用以下的方法:
char* fileName = "bg.png"; 
string filepath = [/font][/color]FileUtils::getInstance()[font=Arial]->fullPathForFilename(fileName); 
FILE *fp = fopen(filepath.c_str(), "r"); 


结果还是报错,一进游戏就挂了,估计是跟底层有关,没有深究,解决方法是使用cocos2dx的CCFileUtil,推荐大家学习Cocos2d-x从零开始视频教程。
char* filename = "bg.png"; 
//获得文件在系统的绝对路径--assets/bg.png 
string filepath = FileUtils::getInstance()->fullPathForFilename(filename); 
//读取的字节数,读取失败则为0 
unsigned long len = 0; 
//读取的内容 
unsigned char *data =FileUtils::getInstance()->getFileData(filepath.c_str(), "rb", &len); 

/* 
此处进行你对文件的操作 
*/ 

//最后记得释放内存 
if(len >0 && data) delete[] data; 

/***********************接口说明***************************** 
static unsigned char* getFileData  ( const char *  pszFileName, 
const char *  pszMode, 
unsigned long *  pSize 
) 
pszMode: 
r 以只读方式打开文件,该文件必须存在。 
r+ 以可读写方式打开文件,该文件必须存在。 
rb+ 读写打开一个二进制文件,允许读数据。 
rt+ 读写打开一个文本文件,允许读和写。 
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) 
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) 
wb 只写打开或新建一个二进制文件;只允许写数据。 
wb+ 读写打开或建立一个二进制文件,允许读和写。 
wt+ 读写打开或着建立一个文本文件;允许读写。 
at+ 读写打开一个文本文件,允许读或在文本末追加数据。 
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。 
*/


问题2:tinyxml
使用tinyxml来读xml文件,之前我的做法是:
//根据xml数据创建动画 
string xmlFile_path = "bg.xml"; 
//读取动作XML文件 
tinyxml2::XMLDocument* doc=new tinyxml2::XMLDocument(); 
doc->LoadFile(xmlFile_path.c_str()); 
tinyxml2::XMLElement *ani_node=doc->RootElement(); 
tinyxml2::XMLElement *action_node=ani_node->FirstChildElement("action"); 

先把xml文件读取到一个buff,然后让tinyxml来解析这个buff,让tinyxml绕过了读取文件失败的bug
//根据xml数据创建动画 
string xmlFile_path = "bg.xml"; 
//获得文件在系统的绝对路径 
string xmlfilepath = [/font]
FileUtils::getInstance()[font=Arial]->fullPathForFilename(xmlFile_path.c_str()); 
//读取的字节数,读取失败则为0 
unsigned long len = 0; 
//读取的内容 
unsigned char *data =[/font]
FileUtils::getInstance()[color=#362e2b][font=Arial]->getFileData(xmlfilepath.c_str(), "r", &len); 
//读取动作XML文件 
tinyxml2::XMLDocument* doc=new tinyxml2::XMLDocument(); 
doc->Parse((char*)data, len); 
tinyxml2::XMLElement *ani_node=doc->RootElement(); 
tinyxml2::XMLElement *action_node=ani_node->FirstChildElement("action");

更多相关知识,大家可以登陆良师益友网学习视频教程。

现在更有面向广大技术宅开展的“冰桶挑战"活动等着大家积极前往挑战自我,成为设计师,只要几十块哦~

posted @ 2014-11-05 14:20  ayneu  阅读(669)  评论(0编辑  收藏  举报