Boost program_options路径中的尾部斜杠和空格无法正确解析

时间:2019-04-29 17:47:53

标签: c++ boost

我不精通C ++。我已经在Windows上继承了Visual Studio 2017 C ++命令行程序,该程序利用了Boost的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”)为假(这是错误的)。

我了解Boost的功能以及原因,但是在线搜索并不能解决问题,而如何解决这一问题我也不知所措。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不熟悉您在此处使用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

这是我运行的代码(与您的代码略有不同),该代码直接从main中的argv输入数组打印数据。

#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;
};