无论如何要在我的 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);
}
}
}
}
扩展你的函数并将 argv
和 argc
传递给它:
expression::expression(int argc, char ** argv)
通话:
int main(int argc, char ** argv)
{
...
expression::expression(argc, argv);
...
}
回答你的问题,是可以在主函数之外传递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);
}
您的 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>
比处理具有单独数组大小值的指针要容易得多。
我从来没有真正使用过 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);
}
}
}
}
扩展你的函数并将 argv
和 argc
传递给它:
expression::expression(int argc, char ** argv)
通话:
int main(int argc, char ** argv)
{
...
expression::expression(argc, argv);
...
}
回答你的问题,是可以在主函数之外传递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);
}
您的 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>
比处理具有单独数组大小值的指针要容易得多。