2012-05-14 50 views
0

我可以利用一些幫助理解我的東西令人費解。它涉及fopen()讀取文件的位置。爲什麼它無論身在何處的fopen使用?

下面的代碼(C編譯用gcc 4.5.2):

#include <stdlib.h> 
#include <stdio.h> 

void try_fopen(FILE* f_handle, const char* f_name, const char* mode) { 
    f_handle = fopen(f_name, mode); 
    if(f_handle == NULL) { 
     fprintf(stderr, "Error: Unable to open '%s'.", f_name); 
     exit(EXIT_FAILURE); 
    } 
} 

int cnt_ones(FILE* pFile) { 
    int c; 
    int n = 0; 

    do { 
     c = fgetc (pFile); 
     if (c == '1') n++; 
    } while (c != EOF); 

    return n; 
} 

爲什麼是它把FOPEN函數中給出了一個段錯誤:

int main (int argc, char** argv) { 
    FILE * pFile; 
    try_fopen(pFile, argv[1], "r"); // Gives a Segfault 

    printf ("The file contains %d ones.\n", cnt_ones(pFile)); 
    fclose (pFile); 

    return 0; 
} 

雖然將其放入主(如果沒有):

int main (int argc, char** argv) { 
    FILE * pFile; 
    pFile = fopen(argv[1], "r"); // While this doesn't give a Segfault 
    if(pFile == NULL) { 
     fprintf(stderr, "Error: Unable to open '%s'.", argv[1]); 
     exit(EXIT_FAILURE); 
    } 

    printf ("The file contains %d sign characters.\n", cnt_ones(pFile)); 
    fclose (pFile); 

    return 0; 
} 
+1

因爲FILE *指針是按值傳遞?要麼返回指針,要麼使用雙指針。 – janneb

+0

我現在看到的,我的方法錯誤。 –

回答

4

C是通過值,而不是通過引用,所以你需要通過poi由於指針pFile按值傳遞給函數try_open

void try_fopen(FILE** f_handle, const char* f_name, const char* mode) { 
    *f_handle = fopen(f_name, mode); 
    if(*f_handle == NULL) { 
     fprintf(stderr, "Error: Unable to open '%s'.", f_name); 
     exit(EXIT_FAILURE); 
    } 
} 

// ... 
try_fopen(&pFile, argv[1], "r"); 
1

:NTER到pFile,否則你不改變它的功能範圍之外。在函數內部修改的值是不是在main可用。爲了解決這個問題,你需要將指針的地址傳遞給函數,所以try_open會接受FILE**fopen結果分配給*pFile。當調用這個函數,你應該使用&pFile合格pFile地址。

0

原因很簡單,當你將FILE *傳遞給函數時,它的更新會因爲Value傳遞而丟失。嘗試將FILE **傳遞給該函數,它將起作用。請參閱本雅明Sharet的回答上面的代碼片斷

這樣做的原因可以理解通過閱讀本link

或者

您可以更改try_open返回FILE *作爲返回值的函數。

FILE *try_fopen(const char* f_name, const char* mode) 
{ 
    FILE *f_handle = NULL;  
    *f_handle = fopen(f_name, mode);  
    if(*f_handle == NULL) 
    {   
    fprintf(stderr, "Error: Unable to open '%s'.", f_name);   
    exit(0);  
    } 
} 

    //In the main function. 
    FILE *pFile = try_fopen(argv[1], "r"); 
1

你可以這樣做:

File * fp; 
try_fopen(&fp,.....); /* void try_fopen (FILE ** fp,....) */ 

或以下:

File * fp = try_fopen("file name"); /* FILE * try_fopen (const char * file_name,...) */ 
相關問題