この記事では、C言語でファイルを読み書きする方法を解説します。
プログラミングをしているとファイルの内容を読み込んでコード内で使用したり、逆に処理した内容をファイルに書き込んで保存しておきたい場合があります。
それでは、ファイルを操作する方法を見ていきましょう。
ファイルを開く
ファイルを開くにはfopen()関数を使います。
#include <stdio.h> FILE *fopen(const char *filename, const char *mode);
fopen()関数には、以下のような引数が定義されています。
| 引数名 | 値 |
|---|---|
| filename | ファイル名 |
| mode | ファイルのモードを文字列で指定 |
指定できるmodeには以下のようなものがあります。
| 文字 | モード |
|---|---|
| r | テキストファイルを読み込みモードで開く。指定されたfilenameのファイルが存在しない場合Noneを返す。 |
| w | テキストファイルを書き込みモードで開く。指定されたfilenameのファイルが存在する場合、長さ0に切り捨てる。存在しない場合、その名前のファイルが新規作成される。 |
| a | テキストファイルを書き込みモードで開く。指定されたfilenameのファイルが存在する場合、ファイルの末尾に追記する。存在しない場合、その名前のファイルが新規作成される。 |
| rb | rのバイナリファイルを扱うバージョン。 |
| wb | wのバイナリファイルを扱うバージョン。 |
| ab | aのバイナリファイルを扱うバージョン。 |
| r+ | テキストファイルを更新モードで開く。更新モードでは読み書きが可能。 |
| w+ | テキストファイルを更新モードで開く。指定されたfilenameのファイルが存在する場合、長さ0に切り捨てる。存在しない場合、その名前のファイルが新規作成される。 |
| a+ | テキストファイルを更新モードで開く。指定されたfilenameのファイルが存在する場合、ファイルの末尾に追記する。存在しない場合、その名前のファイルが新規作成される。 |
| rb+ または r+b | r+のバイナリファイルを扱うバージョン。 |
| wb+ または w+b | w+のバイナリファイルを扱うバージョン。 |
| ab+ または a+b | a+のバイナリファイルを扱うバージョン。 |
fopen()関数によって生成されたファイルポインタを使ってファイルを読み書きしていきます。
ファイルを閉じる
開いたファイルは使い終わったらfclose()関数を使って閉じる必要があります。
#include <stdio.h> int fclose(FILE *stream);
stream引数で指定されるストリームをフラッシュして関連付けられているファイルを閉じます。
例えば、適当なファイルを読み込みモードで開いて閉じるには以下のようにします。
#include <stdio.h> int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 // 読み込みモードでファイルを開く fp = fopen(fname, "r"); // ファイルを閉じる fclose(fp); }
読み込み
ファイルを読み込むには、ファイルを読み込みモードで開く必要があります。
fp = fopen(fname, "r");
ファイルが開けていなかった場合には、Noneが返されるので内容を読み込む前にNoneかどうかを判定すると安全です。
#include <stdio.h> int main() { FILE *fp; char *fname = "test.txt"; fp = fopen(fname, "r"); // ファイルが開けたかどうかの確認 if(fp == NULL) { printf("%s は開けませんでした!\n", fname); return -1; } fclose(fp); }
ここでは、以下のようなtest.txtを読み込んでみます。
test.txt
name: Mike age: 27
ファイルを読み込むには「1文字ずつ読み込む方法」と「1行ずつ読み込む方法」があります。それぞれの方法を見ていきましょう!
1文字ずつ読み込む
fgetc関数を使うことで1文字ずつ読み出すことができます。
#include <stdio.h> int fgetc(FILE *stream);
例として1文字ずつ読み込んで出力してみます。
#include <stdio.h> int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 int c; // 文字 // 読み込みモードでファイルを開く fp = fopen(fname, "r"); // ファイルが開けたかどうかの確認 if(fp == NULL) { printf("%s は開けませんでした!\n", fname); return -1; } // 1文字読み込む c = fgetc(fp); // 1文字出力 putchar(c); c = fgetc(fp); putchar(c); c = fgetc(fp); putchar(c); // ファイルを閉じる fclose(fp); }
実行結果
nam
ファイルの内容を全て読み込むには、EOFが返されるまで読み込めば良い。
#include <stdio.h> int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 int c; // 文字 // 読み込みモードでファイルを開く fp = fopen(fname, "r"); // ファイルが開けたかどうかの確認 if(fp == NULL) { printf("%s は開けませんでした!\n", fname); return -1; } // EOF が返されるまで読み込む while((c = fgetc(fp)) != EOF) { putchar(c); } // ファイルを閉じる fclose(fp); }
実行結果
name: Mike age: 27
1行ずつ読み込む
fgets関数を使うことで1行ずつ読み込むことができます。
#include <stdio.h> char *fgets(char *s, int n, FILE *stream);
例として1行ずつ読み込んで出力してみます。
#include <stdio.h> #define N 32 int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 char s[N]; // 文字列 // 読み込みモードでファイルを開く fp = fopen(fname, "r"); // ファイルが開けたかどうかの確認 if(fp == NULL) { printf("%s は開けませんでした!\n", fname); return -1; } // 1行読み込む fgets(s, N, fp); // 1行出力 printf("%s", s); fgets(s,LENGTH,fp); printf("%s", s); // ファイルを閉じる fclose(fp); }
実行結果
name: Mike age: 27
ファイルの内容を全て読み込むには、NULLが返されるまで読み込めば良い。
#include <stdio.h> #define N 32 int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 char s[N]; // 文字列 // 読み込みモードでファイルを開く fp = fopen(fname, "r"); // ファイルが開けたかどうかの確認 if(fp == NULL) { printf("%s は開けませんでした!\n", fname); return -1; } // NULL が返されるまで読み込む while(fgets(s, N, fp) != NULL) { printf("%s", s); } // ファイルを閉じる fclose(fp); }
実行結果
name: Mike age: 27
書き込み
ファイルに書き込むには、ファイルを書き込みモードで開く必要があります。
fp = fopen(fname, "w");
ファイルに書き込むには、fprintf()関数を使います。
#include <stdio.h> int fprintf(FILE *stream, const char *format, ...);
stream引数で指定されるストリームにformat引数で指定された文字列が出力される。それ以降に続く引数は、format引数内の変換指定子に渡される。
適当に簡単なファイルを作成し、書き込んでみます。
#include <stdio.h> int main() { FILE *fp; // ファイルポインタ char *fname = "test.txt"; // ファイル名 char name[16]; // 名前を受け取る変数 // 名前の入力 printf("名前: "); fgets(name, sizeof(name), stdin); // 書き込みモードでファイルを開く fp = fopen(fname, "w"); // 受け取った名前を書き込む fprintf(fp, "name: %s\n", name); // ファイルを閉じる fclose(fp); }
実行
$ gcc main.c -o main $ ./main 名前: abc
すると、以下のようなファイルが生成されます。
test.txt
name: abc


