好的,我已经稍微更新了我的代码,但我仍然不确定如何使用我传递的命令行参数的向量。我试着像我下面的代码一样设置它,但它不会编译。它给我一个错误,它无法找到argc和argv:
1> c:\ users \ chris \ documents \ visual studio 2008 \ projects \ cplusplustwo \ cplusplustwo \ application.h(32):error C2065:'argc':未声明的标识符 1> c:\ users \ chris \ documents \ visual studio 2008 \ projects \ cplusplustwo \ cplusplustwo \ application.h(32):错误C2065:'argv':未声明的标识符
的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();
}
};
原始帖子
我想从main传递命令行参数。这是高级C ++类的功课。我需要使用向量传递命令行,我不确定我是否正在做所有事情。我会把它传递给像我一样的矢量吗?还有一个copy()命令可用于将命令行参数复制到向量而不是后推吗?
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();
}
};
答案 0 :(得分:10)
我只想写:
vector<string> args(argv + 1, argv + argc + !argc);
这将排除argv[0]
,但即使argc == 0
(可能在Linux下,也可能在其他操作系统中)也是如此。
答案 1 :(得分:2)
argv和argc是传递给main的参数。在您的函数中,您应该使用args [i]和args.length()
答案 2 :(得分:1)
application::commandLine()
将args
作为参数,但它引用的argc
和argv
不在范围内。如果查看编译器的实际错误消息,它应该包含一个文件名和行号,直接指向错误的位置。在向错误消息寻求帮助时,请发布实际的错误消息,而不是解释它。