dポイントプレゼントキャンペーン実施中!

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つの心配は正しい心配ですか?
知識不足のために不要な心配をしているかもしれないと思って質問しました。

A 回答 (3件)

fp = fopen("xx.txt", "r");


これで”xx.txt”ファイルがあるとfpにファイルを扱うアドレスが
入り、ファイルが無い時はNULLポインタが入ります。
fclose(fp)を実行するとそのポインタは開放されるので下のソースでは
正常に読むことは出来ないと思います。
普通は
if((fp=fopen("xx.txt","r")) == NULL )
{
ファイルが無い時の処理;
   exit(-1);
}
正常にオープンできた時の処理
    • good
    • 0
この回答へのお礼

ありがとうございます。
2番目の心配の、
fclose(fp);によって、fpの指す値が保存されているメモリアドレスが開放されて、
それは他のスレットで使用可能なメモリアドレスということになって、他のスレッドによって
fclose(fp);とif (fp)の間の時間に、fpの値が書き換えられてしまうかもしれないという心配。
っていうのはありえることで、正しい心配だったんですね。

お礼日時:2002/12/19 01:28

fclose() に関する質問だとは承知の上ですが、私なら、質問にあるようなことをするならば stat() を使う。



struct stat buf;
if (stat("xx.txt", &buf) == 0 && (buf.st_mode & (S_IRUSR | S_IRGRP | S_IROTH))) {
  /* ファイルが読み込み可能な時の処理 */
} else {
  /* ファイルが読み込み不可能な時の処理 */
}

チェックのためには、それようの手段がある、ということで。

# システムコールなので、VC だと stat() ではなく _stat() の可能性が高い
    • good
    • 0
この回答へのお礼

ありがとうございます。
statは使ったことがなかったんだけど、今初めて使ってみました。

お礼日時:2002/12/19 22:10

> fclose(fp);とif (fp)の間の時間に、fpの値が


> 書き換えられてしまうかもしれないという心配。

*fp はどうなるかわからんが、fpは変化せんでしょ。
    • good
    • 0
この回答へのお礼

fpの値が書き換えられてしまう
ではなくて、
*fpの値が書き換えられてしまう
の間違いでした。

お礼日時:2002/12/19 01:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!