ここで fp/fopen/fclose は、次のような役割を持っています。#include <stdio.h> void func(void) { FILE *fp; fp = fopen("data", "r"); /* data というデータファイルを開く */ /* ここで data というデータファイルからデータを読み出す */ fclose(fp); /* data というデータファイルを閉じる */ }
上のようなプログラムによって生成されたファイル data の内容は、 下のようなプログラムで読み出すことができます。#include <stdio.h> int main(void) { FILE *fp; /* ファイルポインタ */ int w, x, y, z; /* 書き込むデータ */ /* ファイルを書き込み用に開く(この場合は新規作成になる)*/ fp = fopen("data", "w"); /* ファイルが開けなかったらメッセージを表示して、*/ /* 終了ステータスを 1 にしてプログラムを終了する */ if (fp == NULL) { printf("ファイルが開けませんでした\n"); exit(1); } z = (y = (x = (w = 1) + 1) + 1) + 1; /* データを書き込む */ fprintf(fp, "%d %d %d %d\n", w, x, y, z); /* ファイルを閉じる */ fclose(fp); return 0; }
なお、この例では変数の内容を fprintf で文字列に変換して 出力しているので、データファイル data はテキストファイル (画面表示可能な文字からなるファイル)になります。 cat コマンドや more、less などによって、 テキストファイルを画面で見ることができます。#include <stdio.h> int main(void) { FILE *fp; /* ファイルポインタ */ int w, x, y, z; /* 読み出すデータ */ /* ファイルを読み込み用に開く */ fp = fopen("data", "r"); /* ファイルが開けなかったらメッセージを表示して、*/ /* 終了ステータスを 1 にしてプログラムを終了する */ if (fp == NULL) { printf("ファイルが開けませんでした\n"); exit(1); } /* データを読み出す */ fscanf(fp, "%d %d %d %d", &w, &x, &y, &z); printf("%d %d %d %d\n", w, x, y, z); /* ファイルを閉じる */ fclose(fp); return 0; }
% cat data
上の例はキーボードから整数を入力し、 1からその数までの数をデータファイル data に保存します。 このようなプログラムによって作られたデータファイルから データを読み込むには、データをひとつ読む度にデータの終りを検査します。#include <stdio.h> int main(void) { FILE *fp; int i, n; printf("データの数を入れてください: "); scanf("%d", &n); fp = fopen("data", "w"); for (i = 1; i <= n; i++) { fprintf(fp, "%d\n", i); } fclose(fp); return 0; }
scanf/fscanf は 戻り値として変換したデータの数を返します。 もし既にデータファイルの終りまで読み込んでいて、 それ以上入力するデータがなければ、 EOF という記号定数を返します(これも stdio.h で定義されています)。#include <stdio.h> int main(void) { FILE *fp; int i, n = 0, sum = 0; fp = fopen("data", "r"); if (fp == NULL) { printf("ファイルが開けません\n"); exit(1); } while (fscanf(fp, "%d", &i) != EOF) { sum += i; n++; } fclose(fp); printf("データの数は %d 個でした\n", n); printf("データの合計は %d でした\n", sum); return 0; }
また、feof を使えば、 入力の終りに達しているかどうかだけを調べることができます。