0

我最近遇到了一些问题。我想实现我自己的 fopen 函数以进行错误检查。

到目前为止,继承人的相关代码:

enum _Errorcode_ openFile( const char * c_str_filename, const char * c_str_mode, FILE* the_file )
{
    the_file = fopen( c_str_filename, c_str_mode );

    if( the_file == NULL )
    {
        return FILE_IO_ERROR;
    }

    else
    {
        return OK;
    }
}

我这样调用函数:

FILE * oFile = NULL;
...
ErrorCode = openFile( "myfile.txt", "r", oFile );

如果我之后检查 oFile 的指针 addr,它仍然指向 NULL。最重要的是,我的功能返回正常,没有失败。为什么呢?

该文件存在,如果我这样调用 fopen() 函数,一切正常。

4

2 回答 2

2

C 通过值传递参数,因此您分配给 oFile 的副本,这就是为什么您看不到openFile().

传递一个指向它的指针,如下所示:

enum _Errorcode_ openFile( const char * c_str_filename, const char * c_str_mode, FILE** the_file )
{
  *the_file = fopen( c_str_filename, c_str_mode );

  if( *the_file == NULL )
  {
    return FILE_IO_ERROR;
  }
  else
  {
    return OK;
  } 
}
....
FILE * oFile = NULL;
...
ErrorCode = openFile( "myfile.txt", "r", &oFile );
于 2012-12-15T14:13:37.790 回答
1

由于 C 始终是按值传递的,例如,传递给函数的参数是原始变量的副本,因此您需要将指针传递给FILE *

enum _Errorcode_ openFile( const char * c_str_filename, const char * c_str_mode, 
                           FILE** the_file )
{
    *the_file = fopen( c_str_filename, c_str_mode );
    if( *the_file == NULL ) {   return FILE_IO_ERROR; }
    else {  return OK; }
}
于 2012-12-15T14:12:01.220 回答