Программирование для Linux. Профессиональный подход | страница 19
>getopt_long()
>#include
>#include
>#include
>/* Имя программы. */
>const char* program_name;
>/* Вывод информации об использовании программы в поток STREAM
> (обычно stdout или stderr) и завершение работы с выдачей кода
> EXIT_CODE. Возврат в функцию main() не происходит */
>void print_usage(FILE* stream, int exit_code) {
> fprintf(stream, "Usage: %s options [ inputfile ... ]\n",
> program_name);
> fprintf(stream,
> " -h --help Display this usage
> information.\n"
> " -о --output filename Write output to file.\n"
> " -v --verbose Print verbose messages.\n");
> exit(exit_code);
>}
>/* Точка входа в основную программу, параметр ARGC содержит размер
> списка аргументов; параметр ARGV -- это массив указателей
> на аргументы. */
>int main(int argc, char* argv[]) (
> int next_option;
> /* Строка с описанием возможных коротких опций. */
> const char* const short_options = "ho:v";
> /* Массив с описанием возможных длинных опций. */
> const struct option long_options[] = {
> { "help", 0, NULL, 'h' },
> { "output", 1, NULL, 'o' },
> { "verbose", 0, NULL, 'v' },
> { NULL, 0, NULL, 0 } /* Требуется в конце массива. */
> };
> /* Имя файла, в который записываются результаты работы
> программы, или NULL, если вывод направляется в поток
> stdout. */
> const char* output_filename = NULL;
> /* Следует ли выводить развернутые сообщения. */
> int verbose = 0;
> /* Запоминаем имя программы, которое будет включаться
> в сообщения. Оно хранится в элементе argv[0] */
> program_name = argv[0];
> do {
> next_option =
> getopt_long(argc, argv, short_options,
> long_options, NULL);
> switch(next_opt ion) {
> case "h": /* -h или --help */
> /* Пользователь запросил информацию об использовании
> программы, нужно вывести ее в поток stdout и завершить
> работу с выдачей кода 0 (нормальное завершение). */
> print_usage(stdout, 0);
> case 'o': /* -о или --output */
> /* Эта опция принимает аргумент -- имя выходного файла. */
> output_filename = optarg;
> break;
> case 'v': /* -v или --verbose */
> verbose = 1;
> break;
> case '?': /* Пользователь ввел неверную опцию. */
> /* Записываем информацию об использовании программы в поток
> stderr и завершаем работу с выдачей кода 1
> (аварийное завершение). */
> print_usage(stderr, 1);
> case -1: /* Опций больше нет. */
> break;
> default: /* Какой-то непредвиденный результат. */
> abort();