C 为什么在哪里使用fopen很重要?
我需要一些帮助来理解一些令我困惑的事情。它涉及fopen()读取文件的位置 以下代码(用gcc 4.5.2编译的C): 当将其放入主管道时(如果没有):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_
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*指针是按值传递的吗?要么返回指针,要么使用双指针。我现在看到了我的错误。