C 为什么在哪里使用fopen很重要?

C 为什么在哪里使用fopen很重要?,c,file,fopen,C,File,Fopen,我需要一些帮助来理解一些令我困惑的事情。它涉及fopen()读取文件的位置 以下代码(用gcc 4.5.2编译的C): 当将其放入主管道时(如果没有): C是按值传递的,不是按引用传递的,因此您需要将指针传递到pFile,否则不会在函数范围之外对其进行更改: void try_fopen(FILE** f_handle, const char* f_name, const char* mode) { *f_handle = fopen(f_name, mode); if( *f_

我需要一些帮助来理解一些令我困惑的事情。它涉及fopen()读取文件的位置

以下代码(用gcc 4.5.2编译的C):

当将其放入主管道时(如果没有):


C是按值传递的,不是按引用传递的,因此您需要将指针传递到
pFile
,否则不会在函数范围之外对其进行更改:

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");

C是按值传递的,不是按引用传递的,因此您需要将指针传递到
pFile
,否则不会在函数范围之外对其进行更改:

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");

因为指针
pFile
通过值传递给函数
try\u open
。在函数内部修改的值在
主文件中不可用。要解决这个问题,您需要将指针的地址传递给函数,这样
try\u open
将接受
FILE**
,并将
fopen
的结果分配给
*pFile
。调用此函数时,应使用
&pFile

传递
pFile
的地址,因为指针
pFile
按值传递给函数
try\u open
。在函数内部修改的值在
主文件中不可用。要解决这个问题,您需要将指针的地址传递给函数,这样
try\u open
将接受
FILE**
,并将
fopen
的结果分配给
*pFile
。调用此函数时,您应该使用
&pFile

传递
pFile
的地址。原因很简单,当您将FILE*传递给函数时,它的更新将丢失,因为它是按值传递的。尝试将文件**传递给函数,它将正常工作。关于代码片段,请参考上面Binyamin Sharet的回答

通过阅读本文可以理解其原因

您可以更改函数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");

原因很简单,当您将FILE*传递给函数时,它的更新将丢失,因为它是通过值传递的。尝试将文件**传递给函数,它将正常工作。关于代码片段,请参考上面Binyamin Sharet的回答

通过阅读本文可以理解其原因

您可以更改函数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");
您可以执行以下任一操作:

File * fp;
try_fopen( &fp,.....); /* void try_fopen (FILE ** fp,....) */
或以下各项:

File * fp = try_fopen("file name"); /* FILE * try_fopen (const char * file_name,...) */
您可以执行以下任一操作:

File * fp;
try_fopen( &fp,.....); /* void try_fopen (FILE ** fp,....) */
或以下各项:

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

因为FILE*指针是按值传递的?要么返回指针,要么使用双指针。我现在看到了我的错误。因为FILE*指针是按值传递的吗?要么返回指针,要么使用双指针。我现在看到了我的错误。