Xcode загружает ресурсы программы из моей домашней папки, а не из ресурсов - C ++ - PullRequest
3 голосов
/ 19 марта 2012

Это мой первый раз, когда я использую XCode, и мне страшно, насколько неинтуитивна эта IDE.Я слышал, что в прошлом это было лучше, и я действительно надеюсь, что это так.

Моя проблема в том, что ресурсы, которые загружает моя программа, файл данных и файл .ini, он автоматически ищет этот файл в моей домашней папке,Я хочу, чтобы он искал эти файлы в папке Resource .app.Я использую C ++, и все примеры, которые я нашел, предназначены для Objective-C.

Есть идеи, как это исправить?

1 Ответ

7 голосов
/ 19 марта 2012

Возможно, вы предполагаете, что при запуске вашего приложения текущий рабочий каталог процесса является пакетом вашего приложения. Это не так. (Ничего общего с Xcode - это только то, как работает OS X).

Обычно вы используете NSBundle (Objective-C) или CFBundle (C) найти ресурсы в вашем комплекте приложений. Поскольку вы используете C ++, давайте использовать C API.

Чтобы найти URL-адрес файла "myFile.ini" в каталоге ресурсов в вашем комплекте приложений:

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("myFile"), CFSTR("ini"), NULL);
UInt8 filePath[PATH_MAX];
if (CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath)))
{
    // use your API of choice to open and read the file at filePath
}

Или, чтобы просто заменить CWD на ваш пакет приложений:

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyBundleURL(mainBundle);
UInt8 bundlePath[PATH_MAX];
if (CFURLGetFileSystemRepresentation(url, true, bundlePath, sizeof(bundlePath)))
{
    if (chdir((const char*)bundlePath) == 0)
    {
        // now the CWD is your app bundle, and you can use relative path names to access files inside it
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...