Cocos2d-x & android загружает файлы из папки с ресурсами

У меня есть куча файлов plist в папке assets / plist /, и я пытаюсь загрузить эти файлы, чтобы проверить их хеши.

Что происходит, следующий код не подходит для меня

const char *fullPath = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename(name).c_str(); std::ifstream ifs(fullPath, std::ios::binary); std::vector<char> str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); 

Возвращаемый массив символов всегда пуст.

Попытка открыть тот же файл с помощью fopen также приводит к нулевому указателю для дескриптора файла.

Я проверил, что полный путь – это assets/plists/file.plist и что file.plist существует в папке assets/plist .

Что я здесь делаю неправильно?

FileUtils-> getInstance () -> getFileData стал для меня способом чтения ресурсов ресурсов. Я обернул это в служебную функцию при чтении текстовых файлов:

  #include "cocos2d.h" #include <iosfwd> #include <sstream> #include <memory> namespace FileUtil { using ResourceStream = std::basic_istringstream<char>; bool readResourceFile(std::shared_ptr<ResourceStream>& stream,const std::string& filename); bool readResourceFile(std::shared_ptr<ResourceStream>& stream,const std::string& filename) { // Note: Returned data allocated by "malloc" so must free when copy to string stream CCLOG("FileUtil::readResourceFile - Attempting to read resource file %s",filename.c_str()); ssize_t size = 0; char* data = reinterpret_cast<char*>(FileUtils::getInstance()->getFileData(filename, "r", &size)); if(!data || size == 0) { CCLOG("FileUtil::readResourceFile - unable to read filename %s - size was %lu",filename.c_str(),size); if(data) { free(data); } return false; } CCLOG("FileUtil::readResourceFile - Read %lu bytes from resource file %s",size,filename.c_str()); std::string stringData(data); // release since we've copied to string free(data); stream.reset(new std::istringstream(stringData)); return true; } } 

Спасибо borrrden за ссылку. Этот вопрос, о котором вы говорили, не полностью ответил на мой вопрос, но привел меня к этому.

Для тех, кто наткнулся на этот вопрос, папка с ресурсами застряла внутри APK, и в отличие от iOS невозможно читать файлы прямо оттуда. Для последовательного решения, которое будет работать как для iOS, так и для Android, а также для папок в Assets и в противном случае, код ниже использует CCFileUtils в рамках cocos2d-x для чтения файла.

 unsigned long pSize = 0; unsigned char* str = CCFileUtils::sharedFileUtils()->getFileData(name, "rb", &pSize); std::string hash = GCGameUtils::sharedInstance()->hmacForKeyAndData(str, name, pSize); delete[] str; 

Файл cocos2d-x fileutils уже имеет эту классную функцию для getFileData!