将FILE *保存到C中的结构中

时间:2011-12-04 13:11:03

标签: c file-io

我试图在函数中打开文件来加载参数,然后将其保存到包含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);
     ....
}

有谁能告诉我我做错了什么?

4 个答案:

答案 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);
}