C言語入門|ファイル作成・一時ファイル・削除の基礎

ここまでで、ファイルにデータを読み書きする方法を一通り学んできました。
最後に押さえておきたいのが、ファイルそのものを扱う操作です。

プログラムを書いていると、

  • 処理結果を保存するために新しいファイルを作りたい。
  • 作業中だけ使う一時的なファイルがほしい。
  • 不要になったファイルを削除したい。

といった場面がよく登場します。

この章の最後に、
ファイルを作る・一時ファイルを使う・ファイルを削除する
という、実務でもよく使われる基本操作をまとめて確認していきましょう。

ファイルの新規作成の考え方

C言語には「ファイルを作成する専用の関数」は用意されていません。
その代わりに、fopen を書き込みモードで使うことで、新しいファイルを作成します。

書き込みモードによる動作の違い

モードファイルが存在しない場合ファイルが存在する場合
w新規作成される中身が空にされる。
w+新規作成される中身が空にされる。

つまり、
書き込みモードで fopen を呼び出した時点でファイルは作られる
という仕組みです。

サンプル:新しいファイルを作成する

次のプログラムは、新しいファイルを作成し、簡単なメッセージを書き込む例です。

プロジェクト名:14-13-1 ソースファイル名: sample14-13-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE* fp;

    if ((fp = fopen("sample.txt", "w")) == NULL) {
        exit(1);
    }

    fprintf(fp, "ファイルを新しく作成しました\n");
    fclose(fp);

    printf("sample.txt を作成しました\n");
    return 0;
}

このプログラムを実行すると、
sample.txt が新しく作成され、中に文字列が書き込まれます。

一時ファイルとは何か

プログラムの処理中だけ必要で、
処理が終わったら消えてほしいファイル
それが一時ファイルです。

たとえば、

  • 大きなデータを一時的に退避する。
  • 中間結果を保存する。
  • 並び替えや集計の作業用データを保持する。

といった場面で使われます。

tmpfile を使う理由

一時ファイルを自分で作ろうとすると、意外と面倒です。

問題点内容
ファイル名他と衝突しない名前を考える必要がある。
後処理プログラム終了時に確実に削除する必要がある。
安全性他のプログラムから見えないようにしたい。

tmpfile を使うと、これらの問題を一度に解決できます。

tmpfile ― 一時ファイルを作成する

書式

FILE* tmpfile(void);

特徴

  • ファイル名は自動的に決まる。
  • プログラム終了時に自動削除される。
  • 通常のファイルと同じように読み書きできる。

サンプル:一時ファイルを使う

プロジェクト名:14-13-2 ソースファイル名: sample14-13-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE* fp;
    int value = 123;
    int result;

    if ((fp = tmpfile()) == NULL) {
        exit(1);
    }

    fwrite(&value, sizeof(int), 1, fp);
    rewind(fp);
    fread(&result, sizeof(int), 1, fp);

    printf("一時ファイルから読み取った値:%d\n", result);
    fclose(fp);

    return 0;
}

このプログラムでは、

  1. 一時ファイルを作成
  2. データを書き込み
  3. 先頭に戻って読み取り
  4. プログラム終了とともに自動削除

という流れを実現しています。

rewind(fp) とは何をする関数か

rewind(fp); は、
ファイルの読み書き位置をファイルの先頭に戻すための関数です。

一言でいうと、

「今までどこまで読み書きしていても、先頭からやり直す」

ための命令です。

ファイル名を変更する

既存のファイル名を変更したい場合は、rename を使います。

書式

int rename(const char* oldname, const char* newname);

サンプル

rename("old.txt", "new.txt");

成功すると、old.txt は new.txt に名前が変わります。

ファイルを削除する

不要になったファイルを削除するには、remove を使います。

書式

int remove(const char* filename);

サンプル

remove("sample.txt");

削除に成功すると、ファイルは完全に消えます。

まとめ

  • ファイルの作成は fopen の書き込みモードで行う。
  • 一時的な用途には tmpfile を使うと安全で便利
  • rename でファイル名を変更できる。
  • remove で不要なファイルを削除できる。

ファイル入出力は、
読み書きだけでなく、ファイルそのものの扱い方を理解することで完成度が一段上がります。