プログラムで扱ったデータを保存したり、外部のファイルから設定を読み込んだりするためには、ファイル入出力の知識が不可欠です。C言語では、ファイル操作を行うための様々な関数が用意されています。
この記事では、その最も基本的かつ重要な第一歩である、ファイルの開き方 (fopen
) と閉じ方 (fclose
) について、詳しく解説します。
ファイル操作の「鍵」となるFILE
ポインタ
C言語でファイルを操作するには、まず**FILE
型**のポインタ変数(通称:ファイルポインタ)を用意します。このポインタは、プログラムと操作対象のファイルとを繋ぐ「鍵」や「連絡通路」のような役割を果たします。
#include <stdio.h> // ファイル操作には <stdio.h> が必要
int main(void) {
FILE *fp; // ファイルポインタを宣言
// ... この fp を使ってファイルを操作する ...
return 0;
}
ファイルを開く fopen
関数
fopen
は、ファイルを指定したモードで開き、そのファイルへの「鍵」となるファイルポインタを返す関数です。
基本構文: fp = fopen("ファイル名", "オープンモード");
もしファイルを開くのに失敗した場合(ファイルが存在しない、アクセス権がないなど)、fopen
は NULL
という特別な値を返します。そのため、fopen
を使った直後には、必ず NULL
かどうかをチェックするのが鉄則です。
ファイルのオープンモード
fopen
の2番目の引数で、ファイルをどのような目的で開くかを指定します。
モード | 説明 | ファイルがない場合 | ファイルがある場合 |
"r" | 読み込み (Read) | エラー | 先頭から読み込む |
"w" | 書き込み (Write) | 新規作成 | 内容が全て消去され上書きされる |
"a" | 追記 (Append) | 新規作成 | ファイルの末尾に追加する |
"r+" | 読み書き | エラー | 先頭から読み書きできる |
"w+" | 読み書き | 新規作成 | 内容が全て消去され読み書きできる |
"a+" | 読み書き | 新規作成 | 末尾に追記、全体を読み込みできる |
※画像などのバイナリファイルを扱う場合は、上記モードにb
を追加します(例: "rb"
, "wb+"
)。
fopen
の基本的な使い方とエラー処理
#include <stdio.h>
int main(void) {
FILE *fp;
// "my_document.txt"を読み込みモードで開く
if ((fp = fopen("my_document.txt", "r")) == NULL) {
// ファイルが開けなかった場合の処理
printf("ファイルのオープンに失敗しました。\n");
return 1; // 異常終了
}
// --- ここでファイルを使った処理を行う ---
printf("ファイルのオープンに成功しました。\n");
// ファイルを閉じる(後述)
fclose(fp);
return 0; // 正常終了
}
ファイルパスの指定方法(絶対パスと相対パス)
ファイル名を指定する方法には2種類あります。
- 相対パス:
fopen("my_document.txt", "r");
- 実行ファイルがある場所を基準とした位置関係でファイルを指定します。簡単ですが、実行場所が変わるとファイルを見つけられなくなります。
- 絶対パス:
fopen("C:\\Users\\MyName\\Desktop\\my_document.txt", "r");
- ディスクのルートディレクトリからの完全な経路で指定します。どこから実行しても同じファイルを指しますが、環境が違うとパスも変わります。
- 注意: C言語の文字列中では、
\
は特殊な意味を持つため、パスの区切り文字として使う場合は\\
のように2つ重ねて書く必要があります。
ファイルを閉じる fclose
関数
ファイルでの作業が終わったら、fclose
関数を使って必ずファイルを閉じる必要があります。
基本構文: fclose(ファイルポインタ);
なぜ fclose
が重要なのか?
- データの保護: 書き込みモードで開いたファイルは、
fclose
されることで初めて内容がディスクに完全に保存されることが保証されます。閉じ忘れると、データが失われる可能性があります。 - リソースの解放: OSがプログラムのために確保していたファイル関連のメモリやリソースを解放します。多数のファイルを開いたままにすると、システムが不安定になる原因になります。
fopen
でファイルを開いたら、処理の最後には必ず対応する fclose
を書く、と覚えておきましょう。