无论如何要在我的 main.cpp 文件之外传递 argc, argv 吗?

Is there anyway to pass argc, argv outside of my main.cpp file?

我从来没有真正使用过 argc、argv[] 来读取文件,但是程序要求我使用它们。我的问题是我正在读取头文件中的文件并在那里处理它,而不是在 main.h 中处理它。有没有办法在 main.cpp 之外使用 argc、argv[] 输入?

我想在其中使用它的头文件,将 "input.txt" 等替换为 argv。

想在这里使用而不是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);
      }
   }


  }

}

扩展你的函数并将 argvargc 传递给它:

expression::expression(int argc, char ** argv)

通话:

int main(int argc, char ** argv)
{
    ...
    expression::expression(argc, argv);
    ...
}

回答你的问题,可以在主函数之外传递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);
}

您的 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> 比处理具有单独数组大小值的指针要容易得多。