Проблема в том, что .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). Оттуда вы можете изменить путь к любому другому каталогу в файловой системе относительно того, где находится ваш исполняемый файл, обрезав его до соответствующего родительского каталога, а затем добавив имя пути к файлу, который вы хотите открыть.