意外と知らないfcloseの先

アバター
馬場自由
記事: 15
登録日時: 12年前

意外と知らないfcloseの先

投稿記事 by 馬場自由 » 12年前

めっちゃハマったので自分用メモ。
結論から言うと、fclose(Fp);後にFp = NULL;とやると、落ちる。

なんでそんな事したかというと、自分用の軽量fsteramクラス作ろうとしたんですよ。
で、STLのfstream同様デストラクタでファイル閉じるようにしたかったんですが、ファイル開いてる時のみfclose()呼ぶようにしたいなと思ったのです。そこで、ファイルを開いてるかどうかをFILE *Fp;がNULLかどうかで判断してたんですが、これが間違いの始まりだった。
デバッガで挙動追ってて気づいたんですが、fclose(Fp);としてもFpはNULLにならないんですよね。ファイルオープンに失敗するとNULLなので、てっきりfclose後もNULLだと思ってました。
じゃぁ閉じた後ならNULLにしとけばいーじゃん、とfclose後にFp=NULL;を挟んだんですが、これがやばかった。fclose(Fp);fopen("hoge.some",Fp);は普通にできるので、ファイル閉じた後ならファイルポインタに何入れてもいいと思ってました。
が、これは違うようで、プログラム終了直前で落ちるようになってしまい、原因なんなのかわかりませんでした。
色々試行錯誤した結果なんとか特定はしましたが、fclose後の挙動って実は一切知らないので、そもそもファイル読み書きとはどれ程高度なことなのか、勉強しなおさなきゃなーと思いました。。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: 意外と知らないfcloseの先

投稿記事 by h2so5 » 12年前

fcloseの挙動を知らなくても、fcloseの引数を見ればFpがNULLにならないことは自明です。
Fpのアドレス(ポインタのポインタ)を渡さない限り、Fpを書き換えることはできないですから。

あと、fclose後にFp=NULL;を挟むこと自体は問題ないと思うので原因は別にあるのではないかと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前

Re: 意外と知らないfcloseの先

投稿記事 by softya(ソフト屋) » 12年前

fclose後にFp=NULL;で落ちるのは、ありえないのですね。別の問題が有ると思います。

アバター
馬場自由
記事: 15
登録日時: 12年前

Re: 意外と知らないfcloseの先

投稿記事 by 馬場自由 » 12年前

お二人が指摘されたとおり、原因は別の箇所で、fclose何度も呼んでるからでした。恥ずかしいっ