![](/img/trans.png)
[英]Parsing command line arguments without specifying the number of arguments C++
[英]Variable number of command line arguments in C++
我有一个程序( myprogram
),该程序接受一个文件作为输入,并创建另一个文件作为输出。 语法为:
myprogram inputfile outputfile
看起来像这样:
int main ( int argc, char *argv[] )
{
...
if ( argc != 3 ) {
cout<<"wrong number of arguments"<< endl; return 1;}
}
myInputFile = argv[1];
myOutputFile = argv[2];
...
}
所以这里我有argv[1]
作为输入文件。我现在想在语法中添加一些选项。 因此,例如,我希望将myprogram -a inputfile outputfile
作为选项。 选项的数量会有所不同。
这意味着文件名将取决于参数的数量。
在代码中最聪明的方法是什么? 我可以看到一个人只会将最后两个参数作为文件名,然后假定在那之前的参数是选项(所以类似myInputFile = argv[argc - 1]
。这感觉不太正确,因为我结束了有很多if ... then
语句。
所以我的问题是:如何最好地处理可变数量的参数?
最常见的方法是编写一种特殊的方法来处理命令行参数。 您给它argc
和argv
,它返回一组结构化的数据值。 例如
struct commands
{
char* InputFile;
char* OutputFile;
bool WhateverAMeans;
};
这样,您的主循环便具有所需清单,并且不需要大量的循环。
通常,您的方法将使用for循环遍历参数以填充命令。
另外,也可以使用帮助程序类为您完成这项工作,尽管我不建议您使用很长时间没有做过的事情。
如果您不介意,我建议您使用一个处理所有这些问题的库。 尝试使用Boost.Program Options 。 它看起来可能比您预期的要复杂,但功能足够强大。 还有很多C库,例如getopt,popt等
看一下boost :: program_options,这是非常有用且干净的工具。 我还使用了Poco :: OptionSet,但对我来说不是那么干净,就像升压一样。 Poco和boost都需要由您自己构建,但是如果您从未使用过它们-那是很好的开始机会,它们都很棒。
如果您不想使用库,该怎么办:
char* myInputFile = NULL ;
char* myOutputFile = NULL ;
bool option_a = false ;
int argi = 1 ;
while ( argi < argc )
{
const char* args = argv[ argi++ ] ;
switch ( *args )
{
case '-' : /* option/switch */
if ( strcmp( args, "-a" ) == 0 )
option_a = true ;
else
{
std::cerr << "Unknow option " << args << "\n" ;
exit( 1 ) ;
}
break ;
default :
if ( myInputFile == NULL )
myInputFile = args ;
else if ( myOutputFile == NULL )
myOutputFile = args ;
else
{
std::cerr << "Unexpected argument " << args << "\n" ;
exit( 1 );
}
break ;
}
}
最后,当您处理所有参数时,您可以进行一些最终检查,例如,测试是否设置了输入文件和输出文件:
if ( myInputFile == NULL )
{
std::cerr << "Input file missing!\n" ;
exit( 1 ) ;
}
...
您还可以将所有参数放入一个结构中,而不用将它们分开:
struct options_t
{
char* myInputFile ;
char* myOutputFile ;
bool option_a ;
options_t() : myInputFile(), myOutputFile(), option_a() {}
} ;
这样,您可以将所有参数传递给函数,而不必一一列出。
只是一个想法...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.