У меня есть C-программа, построенная на MacOS High Sierra с использованием gcc и make-файла.Первым делом программа читает двоичный файл ввода.Имя файла может быть либо указано в командной строке терминала вместе с командой оболочки, либо программа запросит его, если оно не указано.
Моя проблема заключается в том, что когда входной файл не указан вместе с командой оболочки, программа возвращает ошибку, говоря, что не может открыть файл.
Вот что работает, а что нет: (программа и входной файл находятся в одном каталоге)
- открытьтерминал
- из командной строки типа:
. / имя_программы –i input.dat
=> отлично работает
- открыть терминал
- из командной строки типа:
. / Имя_программы
- подсказки программы: Inputfile:
- Я набираю: input.dat
=> ошибка открытия файла
- открыть Finder и перейти в каталог с программой и входным файлом
- дважды щелкнуть по значку имя_программы
- программа запускается в терминале и запрашивает: Inputfile:
- Я набираю: input.dat
=> Ошибка открытия файла
Я запускаю тот же самый исходный код на Linux и Windows, где он работает нормально, поэтому я думаю, что это должно бытьОС, чего я не понимаю?
Могу добавить, что программе не доверяли, потому что она не пришла из магазина приложений.Ctrl-клик на иконке решил, что.
- РЕДАКТИРОВАТЬ - извините, что не добавили проверяемый код.
Чтобы уточнить: часть argc / argv работает нормально.это последний раздел процедуры, где он запрашивает имя файла, где он идет не так.Может быть, это действительно путь, как предложил Джаббервоки.Я проверю это сегодня вечером и расскажу здесь.
void GetFileName(nr_args, args, filename, json)
int nr_args;
char **args;
char *filename;
int* json;
{
int i = 1;
filename[0] = '\0';
/* the command 'interpreter' itself is stored in argv[0] */
while (i<nr_args) {
if (strcmp(args[i], "-e") == 0) {
/* we cannot set the json flag here, because */
/* flags have not been initialized yet */
*json = 1;
i++;
}
else {
if (strcmp(args[i], "-i") == 0) {
if (nr_args > i+1) {
/* inputfile was specified */
strncpy(filename, args[++i], MAX_ID_LENGTH);
i++;
}
}
else {
PrintError(41, NULL, args[i]);
i++;
}
}
}
if (filename[0] == '\0') {
printf("\n\nInputfile: ");
scanf("%19s", filename);
filename[MAX_ID_LENGTH] = '\0';
/* clear the input buffer, to prevent parsing an */
/* empty string as the first user command */
/* always do a getchar() independent of OS */
getchar();
printf("\n");
}
}
И это та часть, где файл открывается (из main ())
/* Get filename */
GetFileName(argc, argv, inputfile, &json);
/* Open the datafile */
if ((datafile = fopen(inputfile, "rb")) == NULL) {
PrintError(40, NULL, inputfile);
ExitProgram();
return(OK);
}
EDIT2-- Согласно ответу Эндрю Хенле, это прототип.
void GetFileName(int, char**, char*, int*);
Функция вызывается из того же файла, который определен в.