Mac osx c ++ .app не может найти файл fopen () - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть папка в той же директории, что и мой Mac .app, и в ней находится файл с именем test.ssm. Это пытается быть открыта с помощью этой функции:

FILE *input_file = fopen("./data/maps/test.ssm", "r");

Проблема в том, что приложение продолжает получать код: EXC_BAD_ACCESS, потому что не может открыть этот файл. Мой проект был настроен в xcode с использованием обычного проекта coccoa. Это приложение opengl / glut.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Проблема в том, что .app - это пакет, и, следовательно, на самом деле это также структура каталогов, а не "нормальный" файл. Ваш фактический исполняемый файл находится внутри каталога YourApp.app/Contents/MacOSX/. Таким образом, когда вы используете относительный путь, начинающийся с ./, чтобы открыть файл в C-коде, исполняемый файл фактически ищет ваш файл в каталоге YourApp.app/Contents/MacOSX/, а не в родительском каталоге, в котором установлен пакет .app .

Вы можете просмотреть структуру каталогов вашего .app, щелкнув по нему правой кнопкой мыши и выбрав View Package Contents.

.

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

Если вы хотите, чтобы ваш каталог /data находился внутри пакета .app, то вам нужно всего лишь добавить ../ к вашему пути, чтобы вы могли выйти из каталога /MacOSX и в корень .app, где будет найден каталог /data.

Наконец, если вам нужно знать абсолютный путь, где находится ваш исполняемый файл, вы всегда можете использовать C-функцию _NSGetExecutablePath, находящуюся внутри mach-o/dyld.h (то есть вам не нужен target-C). Оттуда вы можете изменить путь к любому другому каталогу в файловой системе относительно того, где находится ваш исполняемый файл, обрезав его до соответствующего родительского каталога, а затем добавив имя пути к файлу, который вы хотите открыть.

1 голос
/ 16 февраля 2014

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

0 голосов
/ 17 сентября 2011

Как сказано выше, .app - это пакет или специальная папка, которую графический интерфейс Mac OS X рассматривает как файл..app - это не то, что запускается, то, что запускается, это your.app/Contents/MacOS/your, а текущий каталог ссылается на your.app/Contents/MacOS/.Если вы не возражаете против использования Objective-C в своем приложении (если вы уже не связываете Foundation.framework, я бы посоветовал вам найти другой способ), вы можете сделать это, чтобы получить путь к комплекту приложения:

const std::string GetApplicationDirectory()
{
    id info = [[NSBundle mainBundle] infoDictionary];
    NSString *bundleID = [info objectForKey: @"CFBundleIdentifier"];

    NSWorkspace *wp = [[NSWorkspace alloc] init];
    NSString *app   = [wp absolutePathForAppBundleWithIdentifier: bundleID];

    const char *str = [[app substringToIndex: [app length] - [[app lastPathComponent] length]]] cStringUsingEncoding: NSASCIIStringEncoding];
    return std::string( str );
}
...