在主函数之外使用命令行参数
Using command line parameters outside of main function
我想要一个程序读取用户通过命令行输入的文件,然后在代码主体中使用。
参见下面的示例代码:
#include <iostream>
#include <fstream>
struct run_t {
std::string file;
};
run_t run;
const POINTER* ptr = toy(run.file, 0);
// Here hardcoded the FILENAME as a string => code works.
// I am trying to get it to work when I read in the filename from the
// first entry on the command line upon program execution:
//
//const POINTER* ptr = toy("FILENAME", 0);
double Toy1(double a, double b, double c) {
return ptr->func(a, b, c);
};
double Toy2(double d) {
double factor = pow(d, 2); //some dummy prefactor
return factor * Toy1(4, 5, 6);
};
int main(int argc, char* argv[])
{
run_t run;
run.file = argv[1];
std::cout << Toy2(1) << std::endl;
return 0;
}
实际的 toy
和 Toy
函数是特定于软件的,并被附加的包含文件识别。如果我使用字符串 FILENAME
在 toy(run.file, 0)
中手动硬编码 run.file
,使用单个命令行参数(例如 ./exe 1
编译和执行)然后程序运行。
我的问题是,如何修改上面的代码,使命令行中输入的值FILENAME
被读取为run.file
?也就是说,让 ./exe FILENAME
工作?我已经尝试将 argv[1]
声明为 toy 的参数,但我还没有让它起作用。
这是我测试过的代码。试试这个
#include <iostream>
#include <fstream>
#include <math.h>
struct run_t {
std::string file;
};
run_t run;
class POINTER{
public:
POINTER(std::string file , int num){std::cout << "POINTER::POINTER(std::string file , int num)file " << file << std::endl;};
double func(double a, double b, double c) {
POINTER *toy(std::string file , int num);
return (double)0;
}
};
POINTER *toy(std::string file , int num)
{
POINTER* ptr = new POINTER(file , num);
std::cout << "POINTER *toy(std::string file , int num) file " << file << std::endl;
return ptr;
}
const POINTER * ptr;
double Toy1(double a, double b, double c) {
POINTER * ptrCst = const_cast<POINTER *>(ptr);
return ptrCst->func(a, b, c);
};
double Toy2(double d) {
double factor = pow(d, 2); //some dummy prefactor
return factor * Toy1(4, 5, 6);
};
int main(int argc, char* argv[])
{
run.file = argv[1];
POINTER * ptrCst = const_cast<POINTER *>(ptr);
ptrCst = toy(run.file, 0);
std::cout << Toy2(1) << std::endl;
while(1);
return 0;
}
首先,ptr
初始化得太早,在 argv[1]
不可用的时候。
其次,main
局部变量run
与用于设置ptr
的全局run
无关Toy1
.
由于我们不知道 toy
是什么,我们无法回答更多。 8-DK 答案是一种可能性。
我想要一个程序读取用户通过命令行输入的文件,然后在代码主体中使用。
参见下面的示例代码:
#include <iostream>
#include <fstream>
struct run_t {
std::string file;
};
run_t run;
const POINTER* ptr = toy(run.file, 0);
// Here hardcoded the FILENAME as a string => code works.
// I am trying to get it to work when I read in the filename from the
// first entry on the command line upon program execution:
//
//const POINTER* ptr = toy("FILENAME", 0);
double Toy1(double a, double b, double c) {
return ptr->func(a, b, c);
};
double Toy2(double d) {
double factor = pow(d, 2); //some dummy prefactor
return factor * Toy1(4, 5, 6);
};
int main(int argc, char* argv[])
{
run_t run;
run.file = argv[1];
std::cout << Toy2(1) << std::endl;
return 0;
}
实际的 toy
和 Toy
函数是特定于软件的,并被附加的包含文件识别。如果我使用字符串 FILENAME
在 toy(run.file, 0)
中手动硬编码 run.file
,使用单个命令行参数(例如 ./exe 1
编译和执行)然后程序运行。
我的问题是,如何修改上面的代码,使命令行中输入的值FILENAME
被读取为run.file
?也就是说,让 ./exe FILENAME
工作?我已经尝试将 argv[1]
声明为 toy 的参数,但我还没有让它起作用。
这是我测试过的代码。试试这个
#include <iostream>
#include <fstream>
#include <math.h>
struct run_t {
std::string file;
};
run_t run;
class POINTER{
public:
POINTER(std::string file , int num){std::cout << "POINTER::POINTER(std::string file , int num)file " << file << std::endl;};
double func(double a, double b, double c) {
POINTER *toy(std::string file , int num);
return (double)0;
}
};
POINTER *toy(std::string file , int num)
{
POINTER* ptr = new POINTER(file , num);
std::cout << "POINTER *toy(std::string file , int num) file " << file << std::endl;
return ptr;
}
const POINTER * ptr;
double Toy1(double a, double b, double c) {
POINTER * ptrCst = const_cast<POINTER *>(ptr);
return ptrCst->func(a, b, c);
};
double Toy2(double d) {
double factor = pow(d, 2); //some dummy prefactor
return factor * Toy1(4, 5, 6);
};
int main(int argc, char* argv[])
{
run.file = argv[1];
POINTER * ptrCst = const_cast<POINTER *>(ptr);
ptrCst = toy(run.file, 0);
std::cout << Toy2(1) << std::endl;
while(1);
return 0;
}
首先,ptr
初始化得太早,在 argv[1]
不可用的时候。
其次,main
局部变量run
与用于设置ptr
的全局run
无关Toy1
.
由于我们不知道 toy
是什么,我们无法回答更多。 8-DK 答案是一种可能性。