Skip to content

Home Программирование Использование опций
Использование опций

Чтобы использовать опции, не обязательно выполнять самостоятельный синтаксический разбор аргументов программы. В этом разделе будут описаны средства обработки односимвольных (коротких) опций при помощи функции

getopt():

Функция getopt () объявлена в заголовочном файле getopt.h следующим образом:

int getopt (int ARGC, char ** ARGV, const char * OPTS);

argc и argv — это знакомые нам аргументы функции main (). В строке opts перечислены опции (без разделителей и дефисов), используемые программой. Если после имени следует двоеточие, это означает, что опция требует наличия зависимого аргумента. Например, если opts указывает на строку a:be, то программа принимает три опции: -а, -b и -с, причем -а подразумевает наличие зависимого аргумента, а опции -b и -с являются флагами.

Обработка опций программы подразумевает неоднократный вызов функции getopt (), которая возвращает код очередной фактически переданной опции. Если пользователь ввел опцию, не указанную в строке opts, to getopt () возвращает код символа "?" (знак вопроса). Когда все имеющиеся опции обработаны, getopt () возвращает -1.

Для чтения аргументов опций и независимых аргументов предназначены следующие внешние переменные, также объявленные в файле getopt.h:

extern char * optarg; extern int optind;

Строка optarg содержит зависимый аргумент обрабатываемой опции, а в переменной optind хранится индекс первого свободного аргумента в массиве argv. При этом следует учитывать, что getopt () перемещает все свободные аргументы в конец argv. Таким образом, они оказываются в диапазоне между optind и argc-i. Если optind больше или равно argc, то это означает, что свободные аргументы отсутствуют.

Рассмотрим пример программы, которая выводит каждый переданный ей свободный аргумент в отдельной строке. Опция -о будет перенаправлять вывод в файл, имя которого указывается в зависимом аргументе. А флаг -h будет выводить краткую справку по работе с программой.

Программа getoptdemo.c

#include <stdio.h> 
#include <getopt.h>
int main (int argc, char ** argv)
{
FILE * outfile = stdout; int i, opt;
char * filename = NULL;
char help_str[] ="Usage: getoptdemo [OPTIONS] ARGUMENTS ...\n" "-h - Print help and exit\n"
"-o <outfile> - Write output to file\n";
while ((opt = getopt (argc, argv, "ho:")) != -1)
{
switch (opt)
{
case 'h':
printf ("%s", help_str);
}
return 0;
case '0':
filename = optarg;
break;
case '?';
fprintf (stderr, "%s",~help_str);
return 1;
default;
fprintf (stderr, "Unknown error\n");
return 1;
}
}
if (optind >= argc)
{
fprintf (stderr, "No argument (s) found\n%s", help_str);
return 1;
}
if (filename != NULL)
{
outfile = fopen (filename, "w");
if (outfile == NULL)
{
fprintf (stderr, "Cannot open " "output file (%s)\n", filename);
return 1;
}
for (i = optind; i < argc; i++)
fprintf (outfile, "%s\n", argv[i]);
if (outfile != stdout) fclose (outfile);
return 0;
}

Рассмотрим все по порядку. Сначала объявляется файловый указатель outfile, который инициализируется значением stdout. Эта запись говорит о том, что по умолчанию (если не указана опция -о) вывод будет осуществляться в стандартный вывод. Указатель filename несет двойную нагрузку: если указана опция -о, в него будет занесено имя файла; если же в указателе filename останется значение null, это будет означать, что опция -о не передавалась. Строка heip_str содержит краткую справку по работе с программой. Если указать опцию -ь, то эта справка будет выводиться в стандартный вывод (stdout). В случае неправильного набора опций или аргументов, справочная информация будет выводиться в стандартный поток ошибок (stderr).

Затем следует цикл обработки опций. Функция getopto вызывается до тех пор, пока не возвратит значение -1, сигнализирующее о том, что все опции обработаны. Опция -h подразумевает вызов справки и завершение программы, ПОЭТОМУ ВМеСТО ИНСТРУКЦИИ break СТОИТ return.

Далее обрабатывается опция -о, зависимый аргумент которой (optarg) заносится в filename. Следующий блок выводит в поток ошибок (stderr) справочную информацию и завершает программу, если пользователь ввел неверную опцию. Наконец, если getopto возвратила что-то еще, то выводится сообщение о неизвестной ошибке, и программа завершается.

После выхода из цикла проверяется наличие свободных аргументов. Если таковые отсутствуют, то программа завершается, выводя сообщение об ошибке и справочную информацию в stderr.

Затем проверяется, пожелал ли пользователь перенаправить вывод в файл. Если опция -о была указана, то в outf ile заносится указатель на открытый файл. В противном случае вывод будет производиться в stdout (стандартный вывод).

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top