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のポインタアドレスを確認すると、それでも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

FILE *Cは常に値渡しであるため、たとえば、関数に渡されるパラメーターは元の変数のコピーであるため、 :へのポインターを渡す必要があります。

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 に答える