2012-05-14 62 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,...) */ 
相关问题