この記事では、ファイルを開く関数について紹介します。
FILE構造体
ファイルに対して、何か操作をするときはFILE構造体を使用します。FILE構造体はstdio.hヘッダで定義されています。FILE構造体のメンバには、ファイル処理に必要なデータが含まれています。FILE構造体のメンバは、処理系によって違う場合があるのでアクセスしないのが一般的です。複数のファイルを扱う際はそれぞれのファイルに対応したファイル構造体のポインタを使います。ポインタ変数を使い分けて処理をするファイルを区別します。ここでは簡単のため、ファイル構造体へのポインタのことを単にファイルのポインタと呼びます。
ファイルを開く
ファイルにデータを書き込むにはまずファイルを開く必要があります。ファイルを開くことによって書き込む途中にファイルが削除されたり他のプログラムによって違うデータが書き込まれたりすることを防ぎます。
ファイルを開くにはfopen関数を用います。
FILE* fopen(const char *filename, const char *mode);
filenameにファイルのパスを指定します。ファイル名のみを指定した場合は、カレントディレクトリ内のファイルとなります。modeは以下の文字列を指定します。
テキストファイル | バイナリファイル | アクセス方法 | 指定したファイルが存在しないとき | 指定したファイルが存在するとき |
r | rb | 読み取り専用 | 失敗 | 成功 |
w | wb | 書き込み専用 | 新規作成 | 内容を破棄 |
a | ab | 書き込み専用 | 新規作成 | 成功 |
r+ | r+bまたはrb+ | 読み取り、書き込み | 失敗 | 成功 |
w+ | w+bまたはwb+ | 読み取り、書き込み | 新規作成 | 内容を破棄 |
a+ | a+bまたはab+ | 読み取り、書き込み | 新規作成 | 成功 |
ファイルを開く処理に成功した場合はそのファイルへのポインタを返し、失敗した場合はNULLを返します。
ファイルを閉じる
ファイルに対する処理が終わった後は、ファイルを閉じなければなりません。ファイルを閉じるにはfclose関数を用います。
int fclose(FILE *fp);
ファイルを閉じると、ほかのプログラムは安全にファイルにアクセスすることができます。
サンプルコード
まずはファイルに書き込むプログラムを作ります
#include <stdio.h>
#include <stdlib.h>
int main(void){
char fname[500];
FILE *fp;
puts("ファイルのパスを入力してください");
scanf("%s",fname);
fp=fopen(fname,"w");
if (fp==NULL){
puts("ファイルを開けません。");
return -1;
} else {
puts("ファイルを開きました。");
}
fclose(fp);
return 0;
}
実行結果1
ファイルのパスを入力してください
test.txt
ファイルを開きました。
このように、ファイルに文字を書き込めました。
実行結果2
ファイルのパスを入力してください
main.exe
ファイルを開けません。
main.exeとは、実行中のプログラムのことなので当然開くことはできません。
まとめ
ファイルに対して読み書きするには、まずファイルを開く必要がある。
※プログラミング言語によってはファイルの開閉が不要なものもありますが、それらの言語では内部的に開閉処理が行われています。
コメント