есть ли встроенный способ сделать аргумент зависимым от другого при использовании getopt? Например, у меня есть настройка переключателя, и все работает нормально, но мне нужен мой аргумент -m (длина цепочки markov), прежде чем я читаю текстовый файл (-i).
Другими словами, я хотел бы убедиться, что другие аргументы не установлены при обработке моего входного аргумента.
Небольшая выдержка:
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;
}
}
Если нет никаких встроенных способов, есть ли у вас чистый способ сделать это? Чистый код важнее, чем эффективность. Спасибо за любую помощь!
Сохраните имя файла и обработайте его только после обработки всех аргументов командной строки. Обычно это лучший подход — код getopt должен только анализировать, а не обрабатывать.
В качестве альтернативы, и так работает большинство команд, не используйте флаг для имени файла … поэтому используется pgm -m foo filename. Затем вы просто обрабатываете оставшиеся аргументы (от argv [optind] до argv [argc-1]) как имена файлов после обработки всех флагов. Это способствует распространенной ситуации, как у вас, при обработке файла в зависимости от значений флага.
Других решений пока нет …