существует ли встроенный способ заставить аргумент зависеть от другого при использовании 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 должен анализировать только, а не обрабатывать.
В качестве альтернативы, и так работает большинство команд, не используйте флаг для имени файла... поэтому используется pgm -m foo filename. Затем вы обрабатываете оставшиеся аргументы (argv [optind] через argv [argc-1]) как имена файлов после обработки всех флагов. Это способствует общей ситуации - например, вашей - обработке файла в зависимости от значений флага.
-m
перед запуском действия в коде обработки опции-i
, и (2) определить подходящую длину Маркова по умолчанию, которая используется, если вы не определили ее с-m
перед указанием файла с-i
. В целом, однако, лучше всего обрабатывать параметры (и значения по умолчанию), а затем обрабатывать файлы. GNUgetopt()
имеет режим, который возвращает имена файлов, как если бы они были аргументами option; Я не проверял, ведет ли себяgetopt_long()
аналогичным образом.