我试图在函数中打开文件来加载参数,然后将其保存到包含args的struct中,以便以后在其他函数中使用。但是我似乎无法正确保存它(FILE * A,* B等于0x0)。到目前为止,我已经到了这里:
struct Args
{
int action; /* holds action token (see teacts)*/
int error;
FILE *A,*B; /* files containing matrixes*/
int r,s; /* start coordinates*/
int power,dir; /* used in some other function */
} Args;
void getArgs(int argc, char *argv[],struct Args * args)
{
....
testopen(argv[4],args->A);
....
}
int openFile (const char *arg, FILE *input)
{
input = fopen(arg,"r");
if (input == NULL)
return (1);
else
return (0);
}
int main (int argc, char **argv)
{
struct Args args = {.action = A_ERROR};
getArgs(argc,argv,&args);
....
}
有谁能告诉我我做错了什么?
答案 0 :(得分:1)
指针在C
中按值传递,就像其他所有内容一样。这一行:
input = ....;
openFile
中的仅更改该函数中局部变量(参数)input
的值,它不会更改args->A
。
要解决这个问题,你可以:
将指向args
的指针传递给openFile
。
int openFile (const char *arg, struct Args *args)
{
args->A = fopen(arg,"r");
...
将指针传递给args->A
(使参数成为FILE**
):
int openFile (const char *arg, FILE **input)
{
*input = fopen(arg,"r");
...
根本没有传递FILE*
,但返回一个并执行:
args->A = openFile(argv[4]);
确保错误时返回NULL
,您可以在来电者中进行错误检查。
答案 1 :(得分:1)
立刻想到两个问题。第一个是当你明确打电话给testopen
时你打电话给openFile
,但我会假设这只是一个错字。
第二个更阴险。如果要在openFile
内更改文件指针,则需要将指针传递给它,因为参数是按值传递的。你可能认为你正在传递一个指针,但实际上你需要一个双指针,因为它是 FILE指针本身你试图改变,而不是指向它。
换句话说,你需要这样的东西:
int openFile (const char *arg, FILE **input) {
*input = fopen( arg, "r");
if (*input == NULL)
return 1;
return 0;
}
:
rc = openFile (argv[4], &(args->A));
答案 2 :(得分:0)
我认为问题在于你的结构初始化器将所有元素初始化为0:
struct args args = {.action = A_ERROR};
这意味着,你的文件* A,* B的值为NULL。因此,您无法在其中保存任何值。再试一次:
struct args args;
args.atction = A_ERROR;
答案 3 :(得分:0)
我认为它应该是这样的:
void getArgs(int argc, char *argv[],struct Args * args)
{
....
openFile(argv[4],&args->A);
....
}
int openFile (const char *arg, FILE **input)
{
*input = fopen(arg,"r");
if (*input == NULL)
return (1);
else
return (0);
}