C++ 在C++;

C++ 在C++;,c++,csv,argv,C++,Csv,Argv,我有一个程序,将两个csv文件和一个签入日期作为输入,并呈现特定的输出。因此,我通常会以这种方式运行可执行文件 ./my_executable file.csv 2015-10-13 然而,我的要求是让用法以这种方式运行 my_executable --input1 ./file1.csv --input2 ./file2.csv --date 2015-08-01 我怎样才能做到这一点。我是否在代码中的某个地方写下了input1、input2和date。非常感谢您的帮助。命令行参数通过ma

我有一个程序,将两个csv文件和一个签入日期作为输入,并呈现特定的输出。因此,我通常会以这种方式运行可执行文件

./my_executable file.csv 2015-10-13
然而,我的要求是让用法以这种方式运行

my_executable --input1 ./file1.csv --input2 ./file2.csv --date 2015-08-01

我怎样才能做到这一点。我是否在代码中的某个地方写下了input1、input2和date。非常感谢您的帮助。

命令行参数通过
main的参数计数和参数列表参数传递给您的程序:

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

这会给你一个全新的开始。

或者如果要手动处理参数。
见:

int main(int argc,const char**argv[]
{
对于(int i=0;i我能想到的最简单的方法是:

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

通常,当您以这种方式给出参数时,顺序应该无关紧要,因此您必须能够以任何顺序解析参数

以下是一个可能的解决方案:

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.
   ...
}
struct参数
{
std::字符串输入1;
std::字符串输入2;
std::字符串日期;
};
bool parse_参数(int argc、char**argv、参数和args)
{
如果(argc<7){//或设置默认值
//打印用法();//实现
返回false;
}

对于In标准C++引用应该讨论参数<>代码>主< /COD>函数。也许你需要一个更好的引用。很显然,是的,你需要写单词……并且期望在每一个之后都有相应的文件路径。我了解ARCC和ARGV。但是,当我尝试运行我的程序MyIAP---INPUT./FIL.CSV时,我得到了一个-BASH:MyIAPP:命令不found@Antithesis您需要将目录添加到PATH变量。请参阅:。将可执行目录的路径附加到PATH,然后您就可以获得预期的行为。
echo$PATH
将打印“:”联接目录路径。这是bash知道搜索可执行文件的目录的方式。由于您的可执行文件目录不在路径中,因此找不到bash报告。[或者您可以将二进制文件移动到$path.ex:/bin中存在的目录中,但除非您了解正在执行的操作,否则不建议这样做]添加了实时演示链接如果定义了
NDEBUG
,并且用户没有传递足够的参数,该程序将显示未定义的行为。
操作员[]
OOB访问是UB。使用
at
@elyse Oops。忽略了这一点。更严重的是:使用,或类似Spirit
#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.
   ...
}