Как сохранить рабочий каталог xcode при компиляции в exec? - PullRequest
0 голосов
/ 21 января 2019

Я кодировал относительно простую программу на C в XCode, в которую я могу вводить неформатированные текстовые файлы со списками словарей, и он возвращает мне html-файл, в котором они содержатся в красивой таблице.Он работает совершенно нормально при запуске в Xcode, извлекает файлы из установленного мной рабочего каталога и помещает туда html-файлы.Тем не менее, я не хочу открывать XCode каждый раз, когда хочу запустить эту программу.Я попытался скомпилировать его через командную строку, но готовый exec не находит файлы, которые он должен открывать, находятся ли они в рабочем каталоге, установленном в XCode, или в том же, что и exec.Я попытался ввести полный путь к файлу, но это тоже не помогает найти их.Вот код для проекта:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char name1[50], name2[50], Eng[15][256], Kanji[15][256], Roma[15][256]; //declare file names and string arrays
    FILE *fptr; //declare file pointer

    printf("Input: ");
    scanf("%s",name2); //input input file, has to be .txt

    printf("\nOutput: ");
    scanf("%s",name1); //input output file, has to be .html

    int i, m;
    printf("\nNumber: ");
    scanf("%d",&m); //input number of kanji in list

    if ((fptr = fopen(name2,"r")) == NULL){
        printf("Error! opening file");
        // error in case input file doesn't exist
        exit(1);
    }

    for (i=0;i<m;i++) {
        fscanf(fptr,"%s%s%s", Eng[i], Kanji[i], Roma[i]); //reads the list into the arrays
    }

    fptr = fopen(name1,"w");

    fprintf(fptr,"<!DOCTYPE html>\n<head>\n<meta charset='utf-8'>\n<script src='/Volumes/PRIVAT/Hobbies/Code/ressources/jquery-3.3.1.min.js'></script>\n\n<link href='https://fonts.googleapis.com/css?family=Kosugi+Maru' rel='stylesheet'>\n\n<link rel='stylesheet' href='style.css'>\n<script src='script.js'></script>\n\n</head>\n<body>\n<table>\n<colgroup> <col id='col1' span='1'> </colgroup>\n<colgroup> <col id='col2' span='2'> </colgroup>\n\n<caption>WEEK 1</caption>\n<tr>\n<th>English</th>\n<th>Kanji</th>\n<th>Reading</th>\n</tr>"); //writes constant part of html file

    for (i=0;i<m;i++) {
        fprintf(fptr,"\n<tr>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n</tr>",Eng[i],Kanji[i],Roma[i]); // writes variable part of html file
    }

    fprintf(fptr,"\n</body>"); //closing html

    fclose(fptr); //closes output 


    return 0;
}

HTML-код в порядке, поэтому не пытайтесь прочитать это здесь.На самом деле мой единственный вопрос - есть ли способ скомпилировать этот проект для запуска в терминале, который сохраняет рабочий каталог.Спасибо за любую помощь!

1 Ответ

0 голосов
/ 24 января 2019

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

Вы можете добавить вызов к getcwd, чтобы увидеть, какой текущий рабочий каталог для вашей программы установлен ( из этого ответа о переполнении стека ).Также полезно добавить вызов к perror, если fopen вернет NULL, чтобы вы могли увидеть причину, по которой это не удалось.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>

int main() {
    char name1[50], name2[50], Eng[15][256], Kanji[15][256], Roma[15][256]; //declare file names and string arrays
    FILE *fptr; //declare file pointer

    // print current working directory
    char cwd[PATH_MAX];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("Current working dir: %s\n", cwd);
    } else {
        perror("getcwd() error");
        return 1;
    }

    printf("Input: ");
    scanf("%s",name2); //input input file, has to be .txt

    printf("\nOutput: ");
    scanf("%s",name1); //input output file, has to be .html

    int i, m;
    printf("\nNumber: ");
    scanf("%d",&m); //input number of kanji in list

    if ((fptr = fopen(name2,"r")) == NULL){
        perror("Error! opening file");
        // error in case input file doesn't exist
        exit(1);
    }

    for (i=0;i<m;i++) {
        fscanf(fptr,"%s%s%s", Eng[i], Kanji[i], Roma[i]); //reads the list into the arrays
    }

    fptr = fopen(name1,"w");

    fprintf(fptr,"<!DOCTYPE html>\n<head>\n<meta charset='utf-8'>\n<script src='/Volumes/PRIVAT/Hobbies/Code/ressources/jquery-3.3.1.min.js'></script>\n\n<link href='https://fonts.googleapis.com/css?family=Kosugi+Maru' rel='stylesheet'>\n\n<link rel='stylesheet' href='style.css'>\n<script src='script.js'></script>\n\n</head>\n<body>\n<table>\n<colgroup> <col id='col1' span='1'> </colgroup>\n<colgroup> <col id='col2' span='2'> </colgroup>\n\n<caption>WEEK 1</caption>\n<tr>\n<th>English</th>\n<th>Kanji</th>\n<th>Reading</th>\n</tr>"); //writes constant part of html file

    for (i=0;i<m;i++) {
        fprintf(fptr,"\n<tr>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n</tr>",Eng[i],Kanji[i],Roma[i]); // writes variable part of html file
    }

    fprintf(fptr,"\n</body>"); //closing html

    fclose(fptr); //closes output 

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...