C言語関係掲示板

過去ログ

No.203.fopen は fcolse しないといけないか


No.1273

fopen と fclose
投稿者---ピーマン(2002/03/17 15:51:04)


fopen は、必ず fcolse しないといけないんですか?
fp == NULL の場合も fcolse しないといけないんですか?


fp = fopen("test.txt", "r");
if(fp == NULL){
cout << "エラー";
exit(1);
}

No.1275

Re:fopen と fclose
投稿者---C職人(2002/03/17 21:23:16)


>fopen は、必ず fcolse しないといけないんですか?
>fp == NULL の場合も fcolse しないといけないんですか?
>
>
>fp = fopen("test.txt", "r");
>if(fp == NULL){
>cout << "エラー";
>exit(1);
>}

fopenができたときはファイルへのアクセスが可能になったということですが
開きっぱなしではCの場合はエラーになることは余りありませんが、開いたものは
閉じるということは必要です。VBですとファイルの閉じ忘れがあるとエラーメッセージが出てしまいます。動的なメモリ確保でも確保した領域は必ず解放するのと同じです。必要なくなったものは後処理として閉じるのが原則です。
またNULLのときは、ファイルポインタを取得できなかったのでファイルは開いていないので閉じる必要はありません。説明が下手ですみません。



No.1276

Re:fopen と fclose
投稿者---ピーマン(2002/03/17 22:59:04)


オープンに失敗した場合は閉じなくていいんですね。
閉じてないソースしか見たことなかったけど、
確認したくて質問紙ました。

オープンに成功しても、閉じずにプログラムを
終了しているソースならいくつか見たことがあります。
でも、やっぱり閉じないといけなかったんですね。
分かりました。ありがとうございます。



No.1284

Re:fopen と fclose
投稿者---かずま(2002/03/19 01:49:58)


> オープンに成功しても、閉じずにプログラムを
> 終了しているソースならいくつか見たことがあります。
> でも、やっぱり閉じないといけなかったんですね。

exit() という関数をご存知ですか。規格書やマニュアルを見ると、
exit() は、オープンされているストリーム、すなわち FILE 構造体を
すべてフラッシュし、クローズすると書かれています。main() から
return した場合も exit() が呼ばれます。したがって、通常のプログ
ラムでは、fclose() を実行しなくても最後にきちんと後始末されます。
もちろん、fclose() を実行してもかまいません。

ただ、ひとつのプログラムでオープンできるファイルの数には制限が
ありますから、その場合は、fclose() が必要になります。

あるいは、ずっと動きつづけるプログラムが、ファイルを作って、
それを他のプログラムに使わせる場合、fclose() を実行しないと、
データが実際のファイルに書き込まれていないことがありますから、
こんなときも fclose() は必要でしょう。


No.1299

Re:fopen と fclose
投稿者---ピーマン(2002/03/21 00:25:54)


あら、必ずclose()しないといけないということは
なかったんですね。

exit()にclose()が含まれていたんですね。
exit()もclose()も使わない

#include <iostream.h>
main(){
int c;
FILE *fp;
fp = fopen("t.txt", "r");
if(fp != NULL){
while((c = fgetc(fp)) != EOF){
putchar(c);
}
}else{
cout << "エラー";
exit(1);
}
// fclose(fp);
// exit(0);
}

の場合は問題があるんですよね?

No.1301

Re:fopen と fclose
投稿者---かずま(2002/03/21 17:09:02)


> exit()にclose()が含まれていたんですね。

close() ではなく、fclose() です。
close() だとフラッシュされません。


> exit()もclose()も使わない
  :
>の場合は問題があるんですよね?

問題ないと書いたのに、気づきませんでしたか。
main を呼び出したところへ戻ったときに、exit() が呼び出されます。
今の場合、main に戻るときに、return 0; を実行していませんから、
exit() に不定な値が渡されるだけのことです。

では、exit() を呼ばずにプログラム(あるいはプロセス) を終了する
のはどんなときか、わかりますか。

abort() や、_exit() を実行したとき、
整数のゼロ除算、不正メモリーのアクセスなどで異常終了するとき、
Ctrl-C などで強制終了するとき、
などは、exit() が呼ばれないので、fclose() は実行されません。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved