我从来没有真正使用argc,argv []来读取文件,但程序要求我希望使用它们。我的问题是我正在读取头文件中的文件并在那里处理而不是main。有没有办法在main.cpp之外使用argc,argv []输入?
头文件我想用它,用argv替换“input.txt”等。
想在这里使用而不是output.txt
void expression::convertToPostFix()
{
{
ofstream fout("output.txt");
stack<char> stack;
stringstream postfix;
while (!obj.empty()) {
stack.push('(');
fout << "InFix is:\t";
while (1) {
if ((obj.front() != ';') && (obj.front() != '.'))
{
const char current = obj.front();
cout << current;
fout << current;
obj.pop();
if (isspace(current)) {
}
else if (isalnum(current)) {
postfix << current;
}
else if ('(' == current) {
stack.push(current);
}
else if (isOperator(current)) {
char rightOperator = current;
while (!stack.empty() && isOperator(stack.top()) && precedence(stack.top(), rightOperator)) {
postfix << ' ' << stack.top();
stack.pop();
}
postfix << ' ';
stack.push(rightOperator);
}
else if (')' == current) {
while (!stack.empty() && '(' != stack.top()) {
postfix << ' ' << stack.top();
stack.pop();
}
stack.pop();
postfix << ' ';
}
}
else
{
obj.pop();
break;
}
}
while (!stack.empty() && '(' != stack.top()) {
postfix << ' ' << stack.top();
stack.pop();
}
stack.pop();
pfix = postfix.str();
postfix.str("");
cout << "\nPost fix is:\t" << pfix << endl << endl;
fout << "\nPost fix is:\t" << pfix << endl << endl;
}
}
}
(也希望在此处使用)
expression::expression()
{
ifix = "";
pfix = "";
last = 0;
char chr;
ifstream fin;
fin.open("input.txt");
while (!fin.eof())
{
fin >> chr;
if (!fin.eof())
{
if (chr != ' ')
{
obj.push(chr);
}
}
}
}
答案 0 :(得分:1)
扩展您的功能并将argv
和argc
传递给它:
expression::expression(int argc, char ** argv)
呼叫:
int main(int argc, char ** argv)
{
...
expression::expression(argc, argv);
...
}
答案 1 :(得分:1)
您的main
函数应该做的第一件事就是将这些字符数组转换为std::vector<std::string>
:
std::vector<std::string> const args(argv, argv + argc);
然后,您可以将std::vector<std::string>
传递给所需的内容:
void expression::expression(std::vector<std::string> const &args)
{
// ...
}
// ...
int main(int argc, char* argv[])
{
std::vector<std::string> const args(argv, argv + argc);
expression::expression(args);
}
如果这不是一个可行的解决方案,因为矢量必须通过很多中间层,您可能会发现以下方法更好。在某处创建以下功能:
std::vector<std::string>& CommandLineArgs()
{
static std::vector<std::string> args;
return args;
}
在main
中,设置值:
int main(int argc, char* argv[])
{
std::vector<std::string> const args(argv, argv + argc);
CommandLineArgs() = args;
}
程序中的其他任何位置,请从中读取:
void expression::expression()
{
auto const& args = CommandLineArgs();
// ...
}
使用std::vector<std::string>
比处理具有单独数组大小值的指针要容易得多。
答案 2 :(得分:0)
回答你的问题,是可以在主要功能之外传递argc
和argv
。
非常简单的使用程序,它使用命令行参数。它将argv [0]作为参数传递给show_usage方法。
#include <iostream>
#include <string>
#include <vector>
static void show_usage(std::string name)
{
std::cerr << "Usage: " << argv[0] << " <option(s)> SOURCES"
<< "Options:\n"
<< "\t-h,--help\t\tShow this help message\n"
<< "\t-d,--destination DESTINATION\tSpecify the destination path"
<< std::endl;
}
int main(int argc, char* argv[])
{
if (argc < 3) {
show_usage(argv[0]);
return 1;
}
std::vector <std::string> sources;
std::string destination;
for (int i = 1; i < argc; ++i) {
std::string arg = argv[i];
if ((arg == "-h") || (arg == "--help")) {
show_usage(argv[0]);
return 0;
} else if ((arg == "-d") || (arg == "--destination")) {
if (i + 1 < argc) { // Make sure we aren't at the end of argv!
destination = argv[i++]; // Increment 'i' so we don't get the argument as the next argv[i].
} else { // Uh-oh, there was no argument to the destination option.
std::cerr << "--destination option requires one argument." << std::endl;
return 1;
}
} else {
sources.push_back(argv[i]);
}
}
return move(sources, destination);
}