- ベストアンサー
fclose(fp);
FILE *fp; fp = fopen("xx.txt", "r"); if (fp) { ファイルが開けた時のxx.txtを使わない処理 fclose(fp); } else { ファイルが開けなかった時の処理 } これを下のように書き換えると動作が変わりますか? FILE *fp; fp = fopen("xx.txt", "r"); fclose(fp); if (fp) { ファイルが開けた時のxx.txtを使わない処理 } else { ファイルが開けなかった時の処理 } 書き換えた場合に動作が変わるかもしれないと思うのは、2つの心配事があるからです。 fclose();という関数が、fpの値を変化させることがあるのか心配。 それと、fclose(fp);によって、fpの指す値が保存されているメモリアドレスが開放されて、 それは他のスレットで使用可能なメモリアドレスということになって、他のスレッドによって fclose(fp);とif (fp)の間の時間に、fpの値が書き換えられてしまうかもしれないという心配。 この2つの心配は正しい心配ですか? 知識不足のために不要な心配をしているかもしれないと思って質問しました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
fp = fopen("xx.txt", "r"); これで”xx.txt”ファイルがあるとfpにファイルを扱うアドレスが 入り、ファイルが無い時はNULLポインタが入ります。 fclose(fp)を実行するとそのポインタは開放されるので下のソースでは 正常に読むことは出来ないと思います。 普通は if((fp=fopen("xx.txt","r")) == NULL ) { ファイルが無い時の処理; exit(-1); } 正常にオープンできた時の処理
その他の回答 (2)
- a-kuma
- ベストアンサー率50% (1122/2211)
fclose() に関する質問だとは承知の上ですが、私なら、質問にあるようなことをするならば stat() を使う。 struct stat buf; if (stat("xx.txt", &buf) == 0 && (buf.st_mode & (S_IRUSR | S_IRGRP | S_IROTH))) { /* ファイルが読み込み可能な時の処理 */ } else { /* ファイルが読み込み不可能な時の処理 */ } チェックのためには、それようの手段がある、ということで。 # システムコールなので、VC だと stat() ではなく _stat() の可能性が高い
お礼
ありがとうございます。 statは使ったことがなかったんだけど、今初めて使ってみました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> fclose(fp);とif (fp)の間の時間に、fpの値が > 書き換えられてしまうかもしれないという心配。 *fp はどうなるかわからんが、fpは変化せんでしょ。
お礼
fpの値が書き換えられてしまう ではなくて、 *fpの値が書き換えられてしまう の間違いでした。
お礼
ありがとうございます。 2番目の心配の、 fclose(fp);によって、fpの指す値が保存されているメモリアドレスが開放されて、 それは他のスレットで使用可能なメモリアドレスということになって、他のスレッドによって fclose(fp);とif (fp)の間の時間に、fpの値が書き換えられてしまうかもしれないという心配。 っていうのはありえることで、正しい心配だったんですね。