12

ファイルを閉じた後に FILE ポインタがどうなるか知りたいです。NULLになりますか?

基本的に、ファイルを閉じる前に、ファイルが既に閉じられているかどうかを確認したい。

たとえば、次のようにします。

FILE *f;

if(f!=NULL)
{
  fclose(f);
}

これを行うことはできますか、それとも他の方法がありますか?

4

4 に答える 4

11

引数は値で渡されるためfclose、ファイル ポインタを に設定する方法はありませんNULLfcloseおそらくFILEあなたがしなければならないものを破壊するので

  • NULLを実行した後、ファイルポインタを手動で設定しますfclose(使用しない限り、別の関数で閉じると機能しませんFILE **
  • 閉じたかどうかを「忘れる」状況に陥らないようにします (注意が必要かもしれません)。
于 2011-12-09T04:29:18.047 に答える
8

ピーター・ノーヴィグは、オーギュスト・コント(1798-1857)を引用しています。

  "Nothing is destroyed until it is replaced"

次のマクロを使用できます。

  #define fclose(fp)  ((fp) ? fclose(fp) : 0, (fp) = 0)

これにより、相反する2 つの問題が修正されます。

  • FILE *ポインターはの後fcloseに NULL されるため、2 回になることはありません fclose'd

  • このバージョンのは、NULL 引数fclose を受け入れます。fcloseHPUX、SGI、CYGWIN などの一般的なバージョンの多くは、NULL に満足しています。Linux や Microsoft などの FreeBSD にインスパイアされたバージョンがそうでないのは奇妙です。

もちろん、マクロには独自の問題があります。

  • 適切なエラー値を返しません。しかし、これを見たい場合は、次のように余分な括弧を付けてマクロを無効にすることができます:if ((fclose)(fp) == EOF){ /* handle error... */ }

  • 引数を複数回使用するため、関数セマンティクスはありません。しかし、これが問題を引き起こすとは考えにくい。しかし、あなたは使うことができます(fclose)。またはFCLOSE、慣例に従って、名前を付けます。

于 2011-12-09T07:37:09.373 に答える
3

FILE * これは FILE 構造へのポインターです。fclose() を呼び出すと、FILE 構造が破棄/解放されますが、FILE* ポインターの値は変更されません。これは、現在存在しない FILE 構造のアドレスがまだ残っていることを意味します。

同じことがmallocで取得するポインターでも起こります

int a malloc(10);
free(a);

それでも a は NULL にはなりません

ほとんどの場合、私はいつもこれをしています

free(a);
a=NULL;

編集:いつでもCLOSED/解放されているかどうかを確認することはできません。free/fclose の後に NULL を割り当てることができることを確認するためだけに、その NULL かどうかを確認して先に進むことができます..

于 2011-12-09T04:46:41.927 に答える
0

はい、これを行うことができます。そしてより良い方法は他に設定fpすることNULL です

ダングリングポインタ(所有していない、または存在しないものを指しているポインタ)になります。

于 2011-12-09T06:30:50.253 に答える