Аргумент getopt зависит от другого

0

существует ли встроенный способ заставить аргумент зависеть от другого при использовании getopt? Например, у меня есть настройка для моего коммутатора, и все работает нормально, но мне нужен мой аргумент -m (длина цепочки марков), прежде чем я прочитаю текстовый файл (-i).

Другими словами, я хотел бы убедиться, что другие аргументы не заданы при обработке моего ввода arg.

Небольшая выдержка:

    while ((opt = getopt_long(argc, argv, "i:shm:", long_options, &option_index))
       != -1)
{
    switch (opt) {
        case 'i':
            inputEnglish.ReadFile((string)optarg);
            break;

        case 'm':
            inputEnglish.setMarkovLength(atoi(optarg));
            break;

        case 's':
            break;

        case 'h':
            printHelp();
            break;

        case '?':
            cout << "dfgdfgdf" << endl;
            return 0;
            break;

        default:
            printHelp();
            return 0;
            break;
    }
}

Если нет каких-либо построенных способов -i n, у вас есть чистый способ сделать это? Чистый код более важен, чем эффективность здесь. Спасибо за любую помощь!

Теги:
getopt
command-line-arguments
getopt-long

1 ответ

1
Лучший ответ

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

В качестве альтернативы, и так работает большинство команд, не используйте флаг для имени файла... поэтому используется pgm -m foo filename. Затем вы обрабатываете оставшиеся аргументы (argv [optind] через argv [argc-1]) как имена файлов после обработки всех флагов. Это способствует общей ситуации - например, вашей - обработке файла в зависимости от значений флага.

  • 0
    Еще две возможности: (1) проверить, была ли установлена опция -m перед запуском действия в коде обработки опции -i , и (2) определить подходящую длину Маркова по умолчанию, которая используется, если вы не определили ее с -m перед указанием файла с -i . В целом, однако, лучше всего обрабатывать параметры (и значения по умолчанию), а затем обрабатывать файлы. GNU getopt() имеет режим, который возвращает имена файлов, как если бы они были аргументами option; Я не проверял, ведет ли себя getopt_long() аналогичным образом.
  • 0
    Большое спасибо! У меня было ощущение, что это было правильно, но я не был уверен, как это сделать. Отличный ответ и комментарий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню