こんにちは、もがちゃんです
今回は、fopenとセットで使用するfcloseの使い方をサンプルソース付きで説明します
fcloseは、ファイルから入力、または、ファイルへ出力する際に使用されます
fopen とともにセットで使用されるのが、fclose になります
目次
fcloseの構文
#include <stdio.h>
int fclose(FILE *stream);
fcloseの説明
fcloseは、streamで指定されたファイルポインタに紐づくファイルをクローズし、その結果を返却する関数です
fclose関数は、その呼出しが成功した場合、streamが指すストリームをフラッシュし、そのストリームに結び付けられたファイルをクローズする。
JISX3010 プログラム言語C
クローズしたいファイルのファイルポインタ(fopen関数の返却値)を指定します
streamで指定されたファイルポインタに紐づくファイルのクローズに
成功した場合、0(ゼロ)を返します
失敗した場合、EOFを返します
fclose関数は、ストリームのクローズに成功した場合、0を返し、何らかのエラーを検出した場合、EOFを返す。
JISX3010 プログラム言語C
fcloseの使い方サンプル
テキストファイルをクローズする簡単なサンプルプログラムを紹介します
line1
line2
line3
line4
#include <stdio.h>
int main(int argc, char *argv[]) {
// "r"モードで test1.txt ファイルをオープン
FILE *fp = fopen("test1.txt","r");
if(fp != NULL) {
// ファイルオープンが成功したら
char buffer[512];
//1行ずつbufferに読み込み標準出力へ出力する
while(fgets(buffer, 512, fp) != NULL) {
printf("%s", buffer);
}
// ファイルをクローズする
int ret = fclose(fp);
if(ret != 0) {
printf("fclose()に失敗しました![%d]\n", ret);
}
}
}
fcloseをしないとどうなるか
fopen関数とfclose関数はセットで使う必要があるのですが、fcloseを忘れた場合どうなるかを以下のソースで試してみます。
ファイルをオープンして1行読んだ結果を標準出力へ出力するだけ(fcloseは行わない)の関数testOpenOnlyを繰り返し実行するだけのソースです。
#include <stdio.h>
void testOpenOnly(long i);
int main(int argc, char *argv[]) {
for(long i=1; ;i++) {
testOpenOnly(i);
}
}
void testOpenOnly(long i) {
// "r"モードで test1.txt ファイルをオープン
FILE *fp = fopen("test1.txt","r");
if(fp != NULL) {
// ファイルオープンが成功したら
char buffer[512];
//1行ずつbufferに読み込み標準出力へ出力する
while(fgets(buffer, 512, fp) != NULL) {
printf("(%ld)%s", i, buffer);
break;
}
// fcloseしない
// fclose(fp);
}
}
このプログラムを実行する前の状態は、以下の通り
プログラムを実行すると以下の画像のようにメモリ使用量がどんどん増加していきます。
さらに実行を続けると画面表示は止まってしまいました。
fcloseを忘れてしまうとどんどんメモリの使用量が増えていくことになります。
ちなみに、fclose行のコメントを外してfcloseをちゃんと行った場合の結果は、以下のようになります。
fcloseをちゃんと行った場合は、メモリ使用量も変わりません。
fcloseのまとめ
fclose関数は、fopen関数とセットで使う関数
fopen関数でオープンしたファイルは、必ずfclose関数でクローズする