ファイル入出力関数はキーボードや画面ではなく、ファイルに対して入出力を行います。ファイルは画面出力とは異なり出力結果の保存が可能ですので、覚えておくと何かと重宝します。
尚、ファイル入出力関数を使用するには、#include <stdio.h> する必要があります。
ファイル入出力は通常、以下の手順で行います。
ファイルポインタとはFILE型へのポインタです。 FILE型では入出力の現在位置(ファイル位置指示子)、ファイルの終端に達したかの情報(ファイル終了指示子)、エラー情報(エラー指示子)、関連するバッファへのポインタなどのファイルの入出力を行う上での必要不可欠な情報を管理しています。 ですから、ファイル入出力を行う際には必ず、このファイルポインタを fopen()によって取得しなければなりません。 また、入出力操作の完了とともに必ず fclose()でファイルクローズしなければなりません。 |
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; /* (1)ファイルポインタの宣言 */ char s[256]; /* (2)ファイルのオープン */ /* ここで、ファイルポインタを取得する */ if ((fp = fopen("smpl.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } /* (4)ファイルの読み(書き)*/ while (fgets(s, 256, fp) != NULL) { /* ここではfgets()により1行単位で読み出し */ printf("%s", s); } fclose(fp); /* (5)ファイルのクローズ */ return 0; }
※ ファイル入出力関数では、ファイルのアクセス位置は、 fgets()などの読み書き関数を発行すると自動的に更新されます。 通常のポインタのようにプログラム上で更新する必要はありません。
ファイル入出力に用いられる主な関数をまとめます。
FILE *fopen(const char *filename, const char *mode);
モード | 動作 | ファイルがあるとき | ファイルがないとき |
---|---|---|---|
"r" | 読み出し専用 | 正常 | エラー(NULL返却) |
"w" | 書き込み専用 | サイズを 0 にする(上書き) | 新規作成 |
"a" | 追加書き込み専用 | 最後に追加する | 新規作成 |
"r+" | 読み込みと書き込み | 正常 | エラー(NULL返却) |
"w+" | 書き込みと読み込み | サイズを 0 にする(上書き) | 新規作成 |
"a+" | 読み込みと追加書き込み | 最後に追加する | 新規作成 |
※ "r"、"w"、"a" はそれぞれ「読み」、「書き」、「追加」の専用モードです。 つまり、"r"モードで fopen したファイルに書き込み動作を行うことは出来ません。 "r+" と "w+" は一見同じ「読み書き」可能に見えますが、先に来るモードが主となる ため、ファイルの有無で動作が異なります。 また、"a+" の書き込みは「追加書き込み」しか出来ません。
バイナリモード | 動作 |
---|---|
(省略時) |
テキストモード 出力時 : 改行文字 '\n'(0x0a) ⇒ '\r' / '\n'(0x0d / 0x0a)に変換 入力時 : '\r' / '\n'(0x0d / 0x0a) ⇒ 改行文字 '\n'(0x0a)に変換 0x1a を EOF(ファイルエンドとする) |
"b" |
バイナリモード("wb"、"rb" のように指定) 上記の変換を行わない 0x1a を EOF扱いしない |
※ MicroSoft系の OS では、テキストファイルの改行は '\r'(0x0d:復帰)と '\n'(0x0a:改行)の2つの コードで表されます。 そのため、テキストモードで改行コード '\n' をファイルに書き込もうとすると、 '\r' '\n' の2文字に変換して書き込みます。 逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の 1文字に変換します。 また、テキストファイル終端の 0x1a を EOF(ファイルエンド)として扱います。(2002.04.08修正) しかし、バイナリファイルには「0x1a」、「0x0d」、「0x0a」はデータとして存在する可能性があり、 それをテキストモードのように変換されては困ってしまいます。 そのため、MicroSoft系のC言語ではテキストモードとバイナリモードを区別します。 なお、UNIX系のC言語ではこれらの区別は不要です。
FILE *fp; if ((fp = fopen("mydata.txt", "r")) == NULL) { /* エラー処理 */ }
int fclose(FILE *fp);
FILE *fp; : fclose(fp);
char *fgets(char *s, int n, FILE *fp);
1行の「最大文字数」を引数(n)で指定する必要がある。 この文字数には '\0' も含まれるので、実際に入力できる文字数は「最大文字数 - 1」となる。
FILE *fp; char str[256]; : fgets(str, 256, fp);
int fputs(const char *s, FILE *fp);
FILE *fp; : fputs("abcdef", fp);
int getc(FILE *fp);
FILE *fp; int c; : c = getc(fp);
int putc(int c, FILE *fp);
FILE *fp; : putc('a', fp);
int fscanf(FILE *fp, const char *format, ...);
scanf のファイル版。
ファイルポインタを指定する以外は scanf と同じ。
FILE *fp; int dt; : fscanf(fp, "%d", &dt);
int fprintf(FILE *fp, const char *format, ...);
printf のファイル版。
ファイルポインタを指定する以外は printf と同じ。
FILE *fp; int dt = 10; : fprintf(fp, "%8d\n", dt);
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved