【C言語入門】fcloseの使い方

【C言語入門】fgetsの使い方

こんにちは、もがちゃんです

今回は、fopenとセットで使用するfcloseの使い方をサンプルソース付きで説明します

fcloseは、ファイルから入力、または、ファイルへ出力する際に使用されます

fopen とともにセットで使用されるのが、fclose になります

fcloseの構文

#include <stdio.h>
int fclose(FILE *stream);

fcloseの説明

fcloseは、streamで指定されたファイルポインタに紐づくファイルをクローズし、その結果を返却する関数です

fclose関数は、その呼出しが成功した場合、streamが指すストリームをフラッシュし、そのストリームに結び付けられたファイルをクローズする。

JISX3010 プログラム言語C
stream

クローズしたいファイルのファイルポインタ(fopen関数の返却値)を指定します

返却値

streamで指定されたファイルポインタに紐づくファイルのクローズに
成功した場合、0(ゼロ)を返します
失敗した場合、EOFを返します

fclose関数は、ストリームのクローズに成功した場合、0を返し、何らかのエラーを検出した場合、EOFを返す。

JISX3010 プログラム言語C

fcloseの使い方サンプル

テキストファイルをクローズする簡単なサンプルプログラムを紹介します

test1.txt
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を使用したサンプルプログラムの動作結果
fcloseを使用したサンプルプログラムの動作結果

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しないとどうなるかテスト実行中(停止)の状態

fcloseを忘れてしまうとどんどんメモリの使用量が増えていくことになります。
ちなみに、fclose行のコメントを外してfcloseをちゃんと行った場合の結果は、以下のようになります。

fcloseをちゃんと行った場合の状態
fcloseをちゃんと行った場合の状態

fcloseをちゃんと行った場合は、メモリ使用量も変わりません。

fcloseのまとめ

fclose関数は、fopen関数とセットで使う関数

fopen関数でオープンしたファイルは、必ずfclose関数でクローズする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA