Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
fopen() / fclose() / freopen()
ファイルを開いたり閉じたりするための基本的な関数です。『<stdio.h>』に定義されており、ファイル操作を行うすべての処理の起点になります。ファイルはオープンしたら必ずクローズする必要があります。
構文
// ファイルをオープンして FILE ポインタを返します。 // 戻り値: 成功時は FILE ポインタ、失敗時は NULL。 FILE *fopen(const char *filename, const char *mode); // ファイルをクローズします。 // 戻り値: 成功時は 0、エラー時は EOF。 int fclose(FILE *stream); // 既存の FILE ポインタを別のファイルに結び付けます(リダイレクトに便利)。 // 戻り値: 成功時は stream、失敗時は NULL。 FILE *freopen(const char *filename, const char *mode, FILE *stream);
モード文字列一覧
| モード | 概要 |
|---|---|
| "r" | 読み込み専用でオープンします。ファイルが存在しない場合は NULL を返します。 |
| "w" | 書き込み専用でオープンします。ファイルが存在しない場合は新規作成、存在する場合は内容を消去します。 |
| "a" | 追記モードでオープンします。ファイルが存在しない場合は新規作成、存在する場合は末尾から書き込みます。 |
| "r+" | 読み書き両用でオープンします。ファイルが存在しない場合は NULL を返します。 |
| "w+" | 読み書き両用でオープンします。存在する場合は内容を消去します。 |
| "a+" | 読み書き両用の追記モードでオープンします。書き込み位置は常に末尾です。 |
| "rb", "wb" 等 | バイナリモードでオープンします。テキストモードとの違いは改行文字の扱いです(Windows 環境で重要)。 |
サンプルコード
#include <stdio.h>
int main(void) {
// "w" モードでファイルを作成し、テキストを書き込みます。
FILE *fp = fopen("sample.txt", "w");
if (fp == NULL) {
// fopen が失敗した場合(パスが存在しない・権限がないなど)。
perror("fopen");
return 1;
}
fprintf(fp, "1行目のテキストです\n");
fprintf(fp, "2行目のテキストです\n");
fprintf(fp, "3行目のテキストです\n");
fclose(fp); // 書き込み後は必ずクローズします。
// "r" モードで先ほど作成したファイルを読み込みます。
fp = fopen("sample.txt", "r");
if (fp == NULL) {
perror("fopen");
return 1;
}
char buf[256];
while (fgets(buf, sizeof(buf), fp) != NULL) {
printf("%s", buf); // 1行ずつ標準出力に表示します。
}
fclose(fp);
// "a" モードで追記します(既存の内容は保持されます)。
fp = fopen("sample.txt", "a");
if (fp == NULL) {
perror("fopen");
return 1;
}
fprintf(fp, "4行目(追記)です\n");
fclose(fp);
printf("追記が完了しました。\n");
return 0;
}
概要
『fopen()』が返す FILE ポインタは、ファイルの読み書き位置や状態を管理する構造体へのポインタです。このポインタを『fgets()』・『fread()』・『fseek()』など各ファイル操作関数に渡して使用します。
fopen() の戻り値は必ず NULL チェックをしてください。ファイルが存在しない場合や権限がない場合に NULL が返ります。チェックを怠るとヌルポインタ参照でプログラムがクラッシュします。
オープンしたファイルは必ず fclose() でクローズしてください。クローズしないと書き込みバッファがフラッシュされず、データが正しく保存されないことがあります。また、オープンできるファイル数にはシステムの上限があり、クローズしないとリソースリークが発生します。
ファイルを1行ずつ読み込む場合は『fgets()』、バイナリデータの読み書きには『fread() / fwrite()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。