2011-12-04 33 views
-1

中的结构中我试图在加载参数的函数中打开文件,然后将其保存到包含args的结构中,以便以后在其他函数中使用。但是我似乎无法正确保存它(FILE * A,* B等于0x0)。这是我到目前为止:将FILE *保存到C

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

可能你已经使用'args'更经常的名字:) – thumbmunkeys

+0

你会得到什么错误?认为你应该显示更多的代码, – Cyclonecode

+0

在这里发布一个错误,请 – azat

回答

1

指针通过值C与其他值一样。行:

input = ....; 

openFile仅在该功能改变局部变量(参数)input的值,它不会改变args->A

为了解决这个问题,你可以:

  • 一个指针传递给argsopenFile

    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,你可以在调用者中进行错误检查。

0

我认为,问题是,你的结构initialisator初始化所有元素为0:

struct args args = {.action = A_ERROR}; 

这意味着,您的FILE * A,* B也越来越值NULL。因此你不能保存任何值。再试一次:

struct args args; 
args.atction = A_ERROR; 
1

两个问题马上就会浮现在脑海。首先是你打电话testopen,当你明确地打电话给openFile,但我会认为这只是一个错字。

第二个是更阴险。如果你想改变openFile中的文件指针,你需要传递一个指针,因为参数是按值传递的。你可能会认为你传递了一个指针,但实际上你需要一个双指针,因为这是你试图改变的文件指针本身,而不是它指向的内容。

换句话说,你需要这样的:

int openFile (const char *arg, FILE **input) { 
    *input = fopen(arg, "r"); 
    if (*input == NULL) 
     return 1; 
    return 0; 
} 
: 
rc = openFile (argv[4], &(args->A)); 
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); 
}