Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как в boost::program_options парсить обяз.параметр


Автор: EvilsInterrupt 18.6.2012, 22:27
Хочу чтобы у моей консольной тулзы был интерфейс:

tools.exe [options] filename

как обрабатывать опции понял, но вот как сделать обработку параметра без указания какой-
либо опции, в примере выше это filename. Т.е. мне нужно знать как обрабатывать'unlabeled' параметры. Это возможно?

Среди примеров в e:\source\boost_1_49_0\libs\program_options\example\ я не нашел. (
Может кто ткнет в нужную строчку и в сорец?

пример того что хочу получить:
c:>\tools.exe -d -e -o e:\samples\test00.dat

как мне написать обработку ком. страки так чтобы получить этот "e:\samples\test00.dat" ?

Автор: bsa 19.6.2012, 12:26
читай внимательно документацию и самоучители. То, что тебе нужно, называется "позиционным параметром" (в терминах boost::program_options): http://www.boost.org/doc/libs/1_49_0/doc/html/program_options/tutorial.html#id2499896

Автор: EvilsInterrupt 19.6.2012, 19:05
Проблема была в непонимании терминологии, спасибо за:
Цитата

называется "позиционным параметром" 

Автор: EvilsInterrupt 25.6.2012, 09:08
bsa, 
А можешь еще подсказать к привести вывод "help"-опции к виду похожему на SYNOPSYS от readelf?
(http://www.freebsd.org/cgi/man.cgi?query=readelf&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html)

У меня пока такое:
Цитата

r:\projects\readpe\bin\Win32-Debug>readpe.exe --help
readpe [ 1.0.0.1 ]
2012 © e-mail: ntvisigoth@gmail.com

Basic options:
  --help                Produce help message
  --nologo              Suppress copyright message
  --input-file arg      Input file

Common options:
  -a [ --all ]              Equivalent to specifying all common options
  -d [ --dos-header ]       Displays the DOS-Header
  -n [ --nt-headers ]       Displays the NT-Headers
  -s [ --sections ]         Displays the sections headers
  -t [ --section-details ]  Displays the sections details
  -h [ --headers ]          Displays the all the headers, Equivalent to -d -n
                            -s
  -e [ --export ]           Displays the export header
  -i [ --imports ]          Displays the import headers
  -r [ --relocs ]           Displays the relocation tables

как видишь в моем случае '--input-file arg' никаким образом не намекает пользователю что это позиционный аргумент, более того пользователь может не знать термина "позиционный", как я неделю назад.

Куда лучше это сделать на манер readelf :
Цитата

  [-H|--help]
        elffile...


это более наглядней!

Мой код пока такой:

Код

        po::options_description basic("Basic options");
        basic.add_options()
            ("help", "Produce help message")
            ("nologo", "Suppress copyright message")
            ("input-file", po::value<string>(), "Input file")
            ;
//....
        po::positional_options_description inFile;
        inFile.add( "input-file", 1 );
//....
        po::store( po::command_line_parser(argc, argv).
            options(allOptions).positional(inFile).run(), parsedArgs );
        po::notify( parsedArgs );
//....
    if( !parsed.count("input-file") )
    {
        throw ConfigureError( "Invalid \"input-file\" option" );
    }
    inputFile = parsed["input-file"].as<std::string>();


Добавлено через 8 минут и 41 секунду
может быть через hidden опции, но как тогда пользователь узнает что существует возможность задать позиционный аргумент не заглядывая в readme.txt?

Автор: Randajad 26.6.2012, 13:09
Подниму темку, что-ли...
boost::po принимает uint8_t переменную за символ со всеми вытекающими. Это баг po или нет и нужно использовать uint(16|32)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)