我不精通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的功能以及原因,但是在线搜索并不能解决问题,而如何解决这一问题我也不知所措。任何建议都将不胜感激。
答案 0 :(得分:0)
我不熟悉您在此处使用Boost的特定语法,我通常使用vm [“ output”]。as
输入命令时:
.\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;
};