反正有没有在我的main.cpp文件之外传递argc,argv?

时间:2017-03-26 16:43:35

标签: c++ argv argc

我从来没有真正使用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);
      }
   }


  }

}

3 个答案:

答案 0 :(得分:1)

扩展您的功能并将argvargc传递给它:

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)

回答你的问题,可以在主要功能之外传递argcargv

非常简单的使用程序,它使用命令行参数。它将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);
}