2011-12-04 44 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); 
}