ファイルを閉じた後に FILE ポインタがどうなるか知りたいです。NULLになりますか?
基本的に、ファイルを閉じる前に、ファイルが既に閉じられているかどうかを確認したい。
たとえば、次のようにします。
FILE *f;
if(f!=NULL)
{
fclose(f);
}
これを行うことはできますか、それとも他の方法がありますか?
引数は値で渡されるためfclose
、ファイル ポインタを に設定する方法はありませんNULL
。fclose
おそらくFILE
あなたがしなければならないものを破壊するので
NULL
を実行した後、ファイルポインタを手動で設定しますfclose
(使用しない限り、別の関数で閉じると機能しませんFILE **
)ピーター・ノーヴィグは、オーギュスト・コント(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
を受け入れます。fclose
HPUX、SGI、CYGWIN などの一般的なバージョンの多くは、NULL に満足しています。Linux や Microsoft などの FreeBSD にインスパイアされたバージョンがそうでないのは奇妙です。
もちろん、マクロには独自の問題があります。
適切なエラー値を返しません。しかし、これを見たい場合は、次のように余分な括弧を付けてマクロを無効にすることができます:if
((fclose)(fp) == EOF){ /* handle error... */ }
引数を複数回使用するため、関数セマンティクスはありません。しかし、これが問題を引き起こすとは考えにくい。しかし、あなたは使うことができます(fclose)
。またはFCLOSE
、慣例に従って、名前を付けます。
FILE * これは FILE 構造へのポインターです。fclose() を呼び出すと、FILE 構造が破棄/解放されますが、FILE* ポインターの値は変更されません。これは、現在存在しない FILE 構造のアドレスがまだ残っていることを意味します。
同じことがmallocで取得するポインターでも起こります
int a malloc(10);
free(a);
それでも a は NULL にはなりません
ほとんどの場合、私はいつもこれをしています
free(a);
a=NULL;
編集:いつでもCLOSED/解放されているかどうかを確認することはできません。free/fclose の後に NULL を割り当てることができることを確認するためだけに、その NULL かどうかを確認して先に進むことができます..
はい、これを行うことができます。そしてより良い方法は他に設定fp
することNULL
です
ダングリングポインタ(所有していない、または存在しないものを指しているポインタ)になります。