在 C++ 中的命令行上获取参数
Taking parameters on the command line in C++
我有一个程序将两个 csv 文件和一个签到日期作为输入并呈现特定的输出。因此,我通常 运行 以这种方式执行可执行文件,
./my_executable file.csv 2015-10-13
但是我的要求是让使用行为如此
my_executable --input1 ./file1.csv --input2 ./file2.csv --date 2015-08-01
我该怎么做。我是否在我的代码中的某处写了 input1、input2 和日期这些词。任何帮助表示赞赏。
命令行参数通过 argument count 和 main
的 argument list 参数传递给您的程序:
int main(int argument_count, char * argument_list[]);
第一个参数是参数的数量,包括可执行文件的名称。
第二个参数是一组 C 风格的字符串,一个用于命令行上的每个参数(或单词)。第一项通常是程序的名称。
你总是可以写一个小程序来测试这个:
#include <iostream>
int main(int arg_count, char * arg_list[])
{
for (unsigned int i = 0; i < arg_count; ++arg_count)
{
std::cout << "Argument " << i << ": " << arg_list[i] << std::endl;
}
return EXIT_SUCCESS;
}
编辑 1:
您的参数将排列为:
参数 0:my_executable
参数 1:--input1
参数 2:./file1.csv
参数 3:--input2
参数 4:./file2.csv
//...
如果你想比较这些参数,那么是的,你需要输入 "input1":
//...
std::string arg1 = arg_list[1];
if (arg1 == "--arg1")
{
//...
}
这应该会给你一个启动。
https://www.gnu.org/software/libc/manual/html_node/Argp-Example-3.html#Argp-Example-3
或者如果您想手动处理参数。
参见:https://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Arguments
int main(int argc, const char **argv[])
{
for(int i = 0; i < argc; i++) {
std::cout << argv[i] << std::endl;
}
return 0;
}
我能想到的最简单的方法:
#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <cassert>
int main(int argc, char *raw_argv[]) {
using namespace std;
vector<string> const args { raw_argv+1, raw_argv+argc };
assert(args.size() < 1 || args[0] == "--input1");
assert(args.size() < 3 || args[2] == "--input2");
if (args.size() > 4) {
std::string const& csv1 = args[1];
std::string const& csv2 = args[3];
std::string date = args.size() > 4? args[4] : "(unspecified)";
std::cout << "Arguments received: " << csv1 << ", " << csv2 << " date:" << date << "\n";
}
}
打印例如
./test --input1 stuff.csv --input2 other.csv
Arguments received: stuff.csv, other.csv date:(unspecified)
通常当你以这种方式给出参数时,顺序应该无关紧要,所以你必须能够以任何顺序解析参数。
这是一个可能的解决方案:
struct arguments
{
std::string input1;
std::string input2;
std::string date;
};
bool parse_arguments(int argc, char** argv, arguments& args)
{
if(argc < 7){ //or set defaults
//print usage();//implement
return false;
}
for(int i=1; i<argc;i+=2){
string command = argv[i];
string argument = argv[i+1];
if(command == "--input1"){
args.input1 = argument;
}
else if(command == "--input2"){
args.input2 = argument;
}
else if(command == "--date"){
args.date = argument;
}
else{
std::cerr<<"Unknown argument: " <<command<<std::endl;
//print usage();
return false;
}
}
if(args.input1.empty() || args.input2.empty() || args.data.empty())
return false;
return true;
}
int main(int argc, char* argv[]){
arguments args;
parse_arguments(argc,argv, args);
//now you can use the struct.
...
}
我有一个程序将两个 csv 文件和一个签到日期作为输入并呈现特定的输出。因此,我通常 运行 以这种方式执行可执行文件,
./my_executable file.csv 2015-10-13
但是我的要求是让使用行为如此
my_executable --input1 ./file1.csv --input2 ./file2.csv --date 2015-08-01
我该怎么做。我是否在我的代码中的某处写了 input1、input2 和日期这些词。任何帮助表示赞赏。
命令行参数通过 argument count 和 main
的 argument list 参数传递给您的程序:
int main(int argument_count, char * argument_list[]);
第一个参数是参数的数量,包括可执行文件的名称。
第二个参数是一组 C 风格的字符串,一个用于命令行上的每个参数(或单词)。第一项通常是程序的名称。
你总是可以写一个小程序来测试这个:
#include <iostream>
int main(int arg_count, char * arg_list[])
{
for (unsigned int i = 0; i < arg_count; ++arg_count)
{
std::cout << "Argument " << i << ": " << arg_list[i] << std::endl;
}
return EXIT_SUCCESS;
}
编辑 1:
您的参数将排列为:
参数 0:my_executable
参数 1:--input1
参数 2:./file1.csv
参数 3:--input2
参数 4:./file2.csv
//...
如果你想比较这些参数,那么是的,你需要输入 "input1":
//...
std::string arg1 = arg_list[1];
if (arg1 == "--arg1")
{
//...
}
这应该会给你一个启动。
https://www.gnu.org/software/libc/manual/html_node/Argp-Example-3.html#Argp-Example-3
或者如果您想手动处理参数。
参见:https://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Arguments
int main(int argc, const char **argv[])
{
for(int i = 0; i < argc; i++) {
std::cout << argv[i] << std::endl;
}
return 0;
}
我能想到的最简单的方法:
#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <cassert>
int main(int argc, char *raw_argv[]) {
using namespace std;
vector<string> const args { raw_argv+1, raw_argv+argc };
assert(args.size() < 1 || args[0] == "--input1");
assert(args.size() < 3 || args[2] == "--input2");
if (args.size() > 4) {
std::string const& csv1 = args[1];
std::string const& csv2 = args[3];
std::string date = args.size() > 4? args[4] : "(unspecified)";
std::cout << "Arguments received: " << csv1 << ", " << csv2 << " date:" << date << "\n";
}
}
打印例如
./test --input1 stuff.csv --input2 other.csv
Arguments received: stuff.csv, other.csv date:(unspecified)
通常当你以这种方式给出参数时,顺序应该无关紧要,所以你必须能够以任何顺序解析参数。
这是一个可能的解决方案:
struct arguments
{
std::string input1;
std::string input2;
std::string date;
};
bool parse_arguments(int argc, char** argv, arguments& args)
{
if(argc < 7){ //or set defaults
//print usage();//implement
return false;
}
for(int i=1; i<argc;i+=2){
string command = argv[i];
string argument = argv[i+1];
if(command == "--input1"){
args.input1 = argument;
}
else if(command == "--input2"){
args.input2 = argument;
}
else if(command == "--date"){
args.date = argument;
}
else{
std::cerr<<"Unknown argument: " <<command<<std::endl;
//print usage();
return false;
}
}
if(args.input1.empty() || args.input2.empty() || args.data.empty())
return false;
return true;
}
int main(int argc, char* argv[]){
arguments args;
parse_arguments(argc,argv, args);
//now you can use the struct.
...
}