Passing command line arguments
c++, command-line, vector
Solution
I'd just write:
vector<string> args(argv + 1, argv + argc + !argc);
This will exclude `argv[0]`, but in a way that's robust even if `argc == 0` (possible under Linux, and maybe other OSs too).
Problem
Okay I have updated my code a little, but I am still not exactly sure how to use the vector of command line arguments that I pass. I tried to set it up like the code I have below, but it wont compile. It gives me the error that it cannot find argc and argv: 1>c:\users\chris\documents\visual studio 2008\projects\cplusplustwo\cplusplustwo\application.h(32) : error C2065: 'argc' : undeclared identifier 1>c:\users\chris\documents\visual studio 2008\projects\cplusplustwo\cplusplustwo\application.h(32) : error C2065: 'argv' : undeclared identifier main.cpp ``` #include "application.h" int main(int argc,char *argv[]){ vector<string> args(argv, argv + argc); return app.run(args); } ``` application.h ``` #include <boost/regex.hpp> #include <iostream> #include <string> #include <fstream> #include <sstream> #include "time.h" using namespace std; class application{ private: //Variables boost::regex expression; string line; string pat; string replace; int lineNumber; char date[9]; char time[9]; void commandLine(vector<string> args){ string expression=""; // Expression string textReplace=""; // Replacement Text string inputFile=""; // Input File string outputFile=""; // Output Directory int optind=1; // decode arguments for(vector<string>::iterator i = args.begin(); i != args.end(); ++i){ while ((optind < argc) && (argv[optind][0]=='-')) { string sw = argv[optind]; if (*i == "-e") { optind++; expression = argv[optind]; } else if (*i == "-t") { optind++; textReplace = argv[optind]; } else if (*i == "-i") { optind++; inputFile = argv[optind]; } else if (*i == "-o") { optind++; outputFile = argv[optind]; } else{ cout << "Unknown switch: " << argv[optind] << "Please enter one of the correct parameters:\n" << "-e + \"expression\"\n-t + \"replacement Text\"\n-i + \"Input File\"\n-o + \"Onput File\"\n"; optind++; } } } } //Functions void getExpression(){ cout << "Expression: "; getline(cin,pat); try{ expression = pat; } catch(boost::bad_expression){ cout << pat << " is not a valid regular expression\n"; exit(1); } } void boostMatch(){ //Define replace {FOR TESTING PURPOSES ONLY!!! REMOVE BEFORE SUBMITTING!! replace = ""; _strdate_s(date); _strtime_s(time); lineNumber = 0; //Files to open //Input Files ifstream in("files/trff292010.csv"); if(!in) cerr << "no file\n"; //Output Files ofstream newFile("files/NEWtrff292010.csv"); ofstream copy("files/ORIGtrff292010.csv"); ofstream report("files/REPORT.dat", ios.app); lineNumber++; while(getline(in,line)){ lineNumber++; boost::smatch matches; copy << line << '\n'; if (regex_search(line, matches, expression)){ for (int i = 0; i<matches.size(); ++i){ report << "Time: " << time << "Date: " << date << '\n' << "Line " << lineNumber <<": " << line << '\n'; newFile << boost::regex_replace(line, expression, replace) << "\n"; } }else{ newFile << line << '\n'; } } } public: void run(vector<string> args){ commandLine(vector<string> args); getExpression(); boostMatch(); } }; ``` ORIGINAL POST I want to pass command line arguments out of main. This is homework for an advanced C++ class. I need to pass the command line with a vector and I am not sure if I am doing everything correctly. Would I pass it into a vector like I did? Also is there a copy() command you can use to copy the command line arguments into a vector rather than pushback? ``` main.cpp #include "application.h" int main(int argc,char *argv[]){ vector<string> args; application app; for (int i=1;i<argc;i++){ args.push_back(argv[i]); } app.run(args); return(0); } ``` application.h ``` #include <boost/regex.hpp> #include <iostream> #include <string> #include <fstream> #include <sstream> #include "time.h" using namespace std; class application{ private: //Variables boost::regex expression; string line; string pat; string replace; int lineNumber; char date[9]; char time[9]; void commandLine(vector<string> args){ string expression=""; // Expression string textReplace=""; // Replacement Text string inputFile=""; // Input File string outputFile=""; // Output Directory int optind=1; // decode arguments for(vector<string>::iterator i = args.begin(); i != args.end(); ++i){ while ((optind < argc) && (argv[optind][0]=='-')) { string sw = argv[optind]; if (*i == "-e") { optind++; expression = argv[optind]; } else if (*i == "-t") { optind++; textReplace = argv[optind]; } else if (*i == "-i") { optind++; inputFile = argv[optind]; } else if (*i == "-o") { optind++; outputFile = argv[optind]; } else{ cout << "Unknown switch: " << argv[optind] << "Please enter one of the correct parameters:\n" << "-e + \"expression\"\n-t + \"replacement Text\"\n-i + \"Input File\"\n-o + \"Onput File\"\n"; optind++; } } } } //Functions void getExpression(){ cout << "Expression: "; getline(cin,pat); try{ expression = pat; } catch(boost::bad_expression){ cout << pat << " is not a valid regular expression\n"; exit(1); } } void boostMatch(){ //Define replace {FOR TESTING PURPOSES ONLY!!! REMOVE BEFORE SUBMITTING!! replace = ""; _strdate_s(date); _strtime_s(time); lineNumber = 0; //Files to open //Input Files ifstream in("files/trff292010.csv"); if(!in) cerr << "no file\n"; //Output Files ofstream newFile("files/NEWtrff292010.csv"); ofstream copy("files/ORIGtrff292010.csv"); ofstream report("files/REPORT.dat", ios.app); lineNumber++; while(getline(in,line)){ lineNumber++; boost::smatch matches; copy << line << '\n'; if (regex_search(line, matches, expression)){ for (int i = 0; i<matches.size(); ++i){ report << "Time: " << time << "Date: " << date << '\n' << "Line " << lineNumber <<": " << line << '\n'; newFile << boost::regex_replace(line, expression, replace) << "\n"; } }else{ newFile << line << '\n'; } } } public: void run(vector<string> args){ commandLine(vector<string> args); getExpression(); boostMatch(); } }; ```