CrossApp开发时, 存放在Resource下的文件在android环境下使用assets/..路径 使用C++的文件操作类如(fopen、ifstream等)找不到的问题
当时遇到的问题是我在Resource文件夹下放入.lrc 的歌词文件。用C++来获取lrc歌词数据并解析。在ios上是没问题的。但是在安卓上就歇逼了。发现问题是没找到文件,在判断is_open()时就通不过了。想过会不会是在android环境不支持ifstream此类C++文件数据流,但是Cocos2d-x的FileUtils::getInstance()->getFileString()就是使用的FILE* ... = fopen()来操作文件的。ifstream按道理讲也应该是没问题才对。想了想如果是单纯的找不到那会不会是路径有问题,然后我就试着输出了文件路径发现是assets/wdzg.lrc.这路径讲道理在android目录下确实是这样的没错。然后就试着搜索cocos2dx 在android平台打开文件问题。
直到看到这篇文章http://blog.csdn.net/hackmind/article/details/39642837终于有点眉目了。 这篇文章说到cocos2d-x 底层,发现android部分是调用的ndk里的AAssetManager_open方法。(略。。)。不是去通过这个路径打开文件,而是去一个文件管理器查找。至此90%确定是这个原因了。接下来又看了几个文章 直到这篇文章 http://blog.csdn.net/dinko321/article/details/41309735 。他说:
一、assets其实是一个zip压缩文件,直接读取里面的内容是不行的。
二、android的实现和其他2个平台不一样。
这次终于确定了原因,路径确实是没有错的 但是原因assets文件的性质(是压缩文件)问题,导致通过路径去获得assets里的内容是行不通的。如此悲惨的发现我不能把文件直接放Resource下了直接使用了。因为我解析.lrc文件用的用到了getline(basic_istream, basic_string)这个C++方法获取文件中的 单行数据。而这个方法的参数就限定了必须用ifstream,用ifstream就要通过路径来获取文件。如此就死循环了。
最后转思路了, 我不放assets下还不行吗。。。。 我就把测试数据放服务器上, 然后下载到本地(使用getWritablePath()获得可读写路径)这样就不是在assets下了。。。。 最后美滋滋的测试通过了。
最后的最后在写这篇文章时想到如果 用FileUtils::getInstance()->getFileString()获得数据再保存一份到本地另一个文件 应该也是可以的。 0.0
(不过我这项目最后必定还是要下载.lrc文件的所以也就没差了)
项目代码就不贴出来了。 思路就是这么个思路了。 希望对看文章的你有帮助。也感谢帮助到我的人。