Архивному приложению не удается открыть текстовый файл, успешно открывается из Xcode

#c #xcode #file

#c #xcode #файл

Вопрос:

В моем проекте есть простой .txt-файл, который успешно открывается из Xcode. Когда я архивирую приложение, файл не загружается, что приводит к сбою приложения. У меня есть другие «ресурсы» в той же папке, что и текстовый файл, которые загружаются без проблем.

 FILE *fp;
if (!(fp=fopen("highScores.txt", "r")))
{
    fprintf(stderr,"nfailed to open file:%sn","highScores.txt");
    exit(0);
}
  

В продукте .app текстовый файл находится в папке «ресурсы» вместе с другими ресурсами.

Спасибо

Комментарии:

1. » сбой приложения » как это возможно при тестировании fopen_success и _exit в случае сбоя? » Когда я архивирую приложение , вы имеете в виду создание dmg _, а затем его установку для выполнения результата? Вы уверены _highScores.txt упакован ли он ? просто загляните в папку установки. Иначе это просто означает, что текущий каталог не тот, который вы предполагаете, распечатайте его при выполнении, чтобы проверить

2. Хорошо, приложение завершает работу без сбоев. Xcode не создает dmg. Когда вы архивируете, а затем экспортируете его, вы получаете nice .app со значком и всем остальным. если щелкнуть правой кнопкой мыши и изучить содержимое папки .app, highscore.txt действительно находится в папке rescorces, созданной xcode. Он также содержит все другие ресурсы, которые открываются.

3. вы открываете другие ресурсы таким же образом ( fopen )? вы уверены, что открываете их из текущего .app, а не из исходного местоположения (переименуйте начальный каталог, чтобы быть уверенным)? Снова, когда открыть не удается, распечатайте текущий каталог, чтобы узнать, где он находится

4. Другими активами являются .png и . файлы wav, они открываются SDL. Так что нет, я не использую fopen для их открытия. Как вы можете видеть, я использую относительный путь для fopen. В настройках Xcode я указал путь, по которому все находится, и все отлично работает с Xcode. Автономное приложение не открывает текстовый файл. Если я выну часть загрузки текстового файла и воссоздам .app, приложение работает нормально, и все ресурсы найдены просто отлично. Может быть разница между тем, как SDL находит ресурсы, и тем, как stdio находит ресурсы

5. » Как вы можете видеть, я использую относительный путь для fopen » вы вообще не используете путь, вы просто пытаетесь открыть в текущем рабочем каталоге, и это не тот, который вы предполагаете, вам нужно добавить относительный путь для открытия в нужном каталоге. Но пока вы не распечатаете его, как я предлагаю вам с самого начала, вы не будете знать, где вы находитесь, поэтому вы не знаете, какой относительный путь добавить…

Ответ №1:

Когда я запускаю приложение под macOS, рабочий каталог / :- (

Чтобы иметь возможность читать файлы, установленные вместе с приложением, одним из способов является чтение с использованием пути относительно пути к исполняемому файлу. Чтобы узнать путь к исполняемому исполняемому файлу, просто используйте getpid и proc_pidpath :

 #include <unistd.h>
#include <libproc.h>
...
char path[PROC_PIDPATHINFO_MAXSIZE];

if (proc_pidpath(getpid(), path, sizeof(path)) > 0) {
  /* here path contains the path of the executable, for instance
     /Applications/.../xxx.app/Contents/MacOS/xxx */
}