Файлы в папках не найдены в приложении iOS с использованием C ++ - PullRequest
7 голосов
/ 30 ноября 2010

Я пытаюсь прочитать файлы, хранящиеся в папке активов и ее подпапках, используя std :: ifstream в приложении iOS, написанном в основном на C ++ (этот же код используется и в других проектах, не относящихся к iOS), но онине найдено.Пример: есть файл assets / shaders / ortho2d.vert , и я пытаюсь загрузить его следующим образом:

std::ifstream vertFStream( vertFile ); // vertFile's contents is "assets/shaders/ortho2d.vert"
if (!vertFStream) {
    std::cerr << vertFile << " missing!" << std::endl;
    exit( 1 );
}

Я добавил папку ресурсов в проект XCodeв виде синей папки, которая отображается в Targets-> Copy Bundle Resources.

Ответы [ 3 ]

11 голосов
/ 30 ноября 2010

Попробуйте это:

NSBundle *b = [NSBundle mainBundle];
NSString *dir = [b resourcePath];
NSArray *parts = [NSArray arrayWithObjects:
                  dir, @"assets", @"shaders", @"ortho2d.vert", (void *)nil];
NSString *path = [NSString pathWithComponents:parts];
const char *cpath = [path fileSystemRepresentation];
std::string vertFile(cpath);
std::ifstream vertFStream(vertFile);
1 голос
/ 30 ноября 2010

Вам может потребоваться проверить относительный путь, из которого запущено приложение, и, возможно, использовать полный путь, чтобы убедиться, что файл найден.

Тот факт, что открытие не удалось, не обязательно означает, что файл не найден, просто он может быть не читаемым в данный момент. (Неверные разрешения или файл заблокирован).

выход (1) довольно радикальный.

0 голосов
/ 27 июля 2017

извините, но некоторые знаки препинания:

  1. на iOS с использованием вызовов файловой системы из C ++ крайне не рекомендуется из-за проблем безопасности и ограниченной поддержки с точки зрения безопасности.вызовы в файловую систему должны выполняться, если вы хорошо знакомы с iOS app
    макет папки.(связки, ресурсы, папка «Документы» и т. д.) в противном случае произойдет сбой. c) вы можете смешивать c ++ и objC, но определенно это неправильный подход.
  2. под iOS вы должны использовать swift или objCза исключением очень ограниченных случаев)
  3. используйте API для iOS, точно так же, как в Android вы бы использовали java
...