Повысить косую черту program_options и пробел в пути, неправильно разбирая - PullRequest
0 голосов
/ 29 апреля 2019

Я не опытный в C ++.Я унаследовал программу командной строки Visual Studio 2017 C ++ в Windows, которая использует Boost's program_options:

#include <boost/program_options.hpp>
namespace po = boost::program_options;

    struct Options
    {
        std::string input;
        std::string output;
        std::string xmlfilter;
    };

        Options opts;
        po::options_description desc("OPTIONS");
        desc.add_options()
            ("input,i", po::value<string>(&opts.input)->required(), "input file")
            ("output,o", po::value<string>(&opts.output)->required(), "output folder path")
            ("xmlfilter,x", po::value<string>(&opts.filter)->implicit_value(""), "enable XML filtering (optionally specify config file)")

        po::variables_map vm;
        store(parse_command_line(argc, argv, desc), vm);

Если путь к выходной папке содержит пробел в имени, в Windows он должен быть заключен в двойные кавычки,По указанию моего руководства, программа должна также разрешить выходной путь иметь обратную косую черту или нет по выбору пользователя.Когда командная строка выглядит следующим образом:

exename -i inputfile -o "output path\" -x

карта переменных имеет неверные результаты.

vm.count ("output") - true (правильно), а opts.output -«output path \» -x »(что неверно).

vm.count (« xmlfilter ») - false (что неверно).

Я понимаю, что делает Boost и почему, но онлайн-поиск не дает исправления, и я не знаю, как его исправить. Любой совет очень ценится.

1 Ответ

0 голосов
/ 30 апреля 2019

Я не знаком с конкретным синтаксисом, который вы используете здесь с Boost, я обычно использую vm ["output"]. As (). Однако, как я вижу, ваша проблема не в Boost, а в командной строке Windows.

При вводе команды:

.\a.exe -i inputfile -o "output path\" -x

Конечная двойная кавычка после пути экранируется символом \. Насколько я понимаю, использование двух символов \ решает вашу проблему. Однако, если вы абсолютно не можете использовать \\ вместо \, я не уверен, что вам сказать.

.\a.exe -i inputfile -o "output path\\" -x

Вот мой вывод с синглом \

>.\a.exe -i inputfile -o "output path\" -x
1  .\a.exe
2  -i
3  inputfile
4  -o
5  output path" -x

opts.output =
vm.count("output") = 1
vm("output").as<std::string>() = output path" -x
vm.count("xmlfilter") = 0

А вот и с двойным \

>.\a.exe -i inputfile -o "output path\\" -x
1  .\a.exe
2  -i
3  inputfile
4  -o
5  output path\
6  -x

opts.output =
vm.count("output") = 1
vm("output").as<std::string>() = output path\
vm.count("xmlfilter") = 1

Для справки вот код, который я запустил (немного отличается от вашего), который печатает данные непосредственно из входного массива argv в main.

#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;

struct Options
{
    std::string input;
    std::string output;
    std::string xmlfilter;
};

int main (int argc, char* argv[])
{
    using namespace std;
    Options opts;
    po::options_description desc("OPTIONS");
    desc.add_options()
        ("input,i", po::value<string>(&opts.input)->required(), "input file")
        ("output,o", po::value<string>(&opts.output)->required(), "output folder path")
        ("xmlfilter,x", po::value<string>(&opts.xmlfilter)->implicit_value(""), "enable XML filtering (optionally specify config file)")
        ;

    po::variables_map vm;
    store(parse_command_line(argc, argv, desc), vm);

    for (int i = 0; i < argc; ++i)
        cout << i+1 << "  " << argv[i] << endl;

    cout << endl;
    cout << "opts.output = " << opts.output << endl;
    cout << "vm.count(\"output\") = " << vm.count("output") << endl;
    cout << "vm(\"output\").as<std::string>() = " << vm["output"].as<std::string>() << endl;
    cout << "vm.count(\"xmlfilter\") = " << vm.count("xmlfilter") << endl;
    return 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...