![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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つの心配は正しい心配ですか?
知識不足のために不要な心配をしているかもしれないと思って質問しました。
No.1ベストアンサー
- 回答日時:
fp = fopen("xx.txt", "r");
これで”xx.txt”ファイルがあるとfpにファイルを扱うアドレスが
入り、ファイルが無い時はNULLポインタが入ります。
fclose(fp)を実行するとそのポインタは開放されるので下のソースでは
正常に読むことは出来ないと思います。
普通は
if((fp=fopen("xx.txt","r")) == NULL )
{
ファイルが無い時の処理;
exit(-1);
}
正常にオープンできた時の処理
ありがとうございます。
2番目の心配の、
fclose(fp);によって、fpの指す値が保存されているメモリアドレスが開放されて、
それは他のスレットで使用可能なメモリアドレスということになって、他のスレッドによって
fclose(fp);とif (fp)の間の時間に、fpの値が書き換えられてしまうかもしれないという心配。
っていうのはありえることで、正しい心配だったんですね。
No.3
- 回答日時:
fclose() に関する質問だとは承知の上ですが、私なら、質問にあるようなことをするならば stat() を使う。
struct stat buf;
if (stat("xx.txt", &buf) == 0 && (buf.st_mode & (S_IRUSR | S_IRGRP | S_IROTH))) {
/* ファイルが読み込み可能な時の処理 */
} else {
/* ファイルが読み込み不可能な時の処理 */
}
チェックのためには、それようの手段がある、ということで。
# システムコールなので、VC だと stat() ではなく _stat() の可能性が高い
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- 営業・販売・サービス FP無料相談サービスの営業電話がきて、お金は一切かからないと言われたので指定されたカフェを訪問したら 2 2022/12/22 21:52
- フィナンシャルプランナー(FP) FP相談に、本人確認は必須ですか? 3 2022/04/25 11:03
- 個人事業主・自営業・フリーランス 都会に行けば、フルコミの営業とかあるらしいけど、それって完全にフリーランスやないですか? 普通、独立 1 2023/04/10 16:30
- フィナンシャルプランナー(FP) FP検定は「エフピーけんてい」で読み方会ってますか汗 2 2022/04/20 22:37
- 弁護士・行政書士・司法書士・社会保険労務士 社会保険労務士とFPは似てる資格ですか? 4 2022/12/19 01:49
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
改行までの一文字ずつのファイ...
-
VBSで指定行に挿入
-
fgetsで2行目から文字化け
-
テキストファイルの行数を取得...
-
テキストファイルの各行の文字...
-
c言語 2つのファイルを行ご...
-
バイナリファイルをテキストフ...
-
fopenで開いたファイルのサイズ...
-
fprintfで出力するファイルのパ...
-
ファイル内のデータを1行削除...
-
fclose(fp);
-
fgetsの使い方
-
VC++6でfgets関数の変わりにな...
-
freadとfwrite
-
C言語 CSVファイルの読み込み
-
テキストファイルの文字列の削除
-
Active Basic EditBoxや文字列...
-
winsock recvでの文字化け
-
C言語のfeof関数について質問
-
バッファとは何ですか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
テキストファイルの行数を取得...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
VBSで指定行に挿入
-
ファイルサイズ指定し、ファイ...
-
c言語 2つのファイルを行ご...
-
freadとfwrite
-
winsock recvでの文字化け
-
【VB.Net】バイト型配列に読み...
-
C言語での改行コードの扱いにつ...
-
fopen(書き込みモード)でファイ...
-
fortranで文字列を読み込む際の...
-
EOF判定されない
-
改行までの一文字ずつのファイ...
-
InternetReadFileで大きいファ...
-
freadでファイルを読み込んだ際...
-
C言語での採番について
-
複数テキストファイルを読み込...
-
C言語 バイナリファイルの読み...
おすすめ情報