#include <stdio.h>
void func(void)
{
FILE *fp;
fp = fopen("data", "r"); /* data というデータファイルを開く */
/* ここで data というデータファイルからデータを読み出す */
fclose(fp); /* data というデータファイルを閉じる */
}
ここで fp/fopen/fclose は、次のような役割を持っています。
#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;
}
上のようなプログラムによって生成されたファイル data の内容は、
下のようなプログラムで読み出すことができます。
#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;
}
なお、この例では変数の内容を fprintf で文字列に変換して
出力しているので、データファイル data はテキストファイル
(画面表示可能な文字からなるファイル)になります。
cat コマンドや more、less などによって、
テキストファイルを画面で見ることができます。
% cat 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;
}
上の例はキーボードから整数を入力し、
1からその数までの数をデータファイル data に保存します。
このようなプログラムによって作られたデータファイルから
データを読み込むには、データをひとつ読む度にデータの終りを検査します。
#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;
}
scanf/fscanf は
戻り値として変換したデータの数を返します。
もし既にデータファイルの終りまで読み込んでいて、
それ以上入力するデータがなければ、
EOF という記号定数を返します(これも stdio.h で定義されています)。
また、feof を使えば、 入力の終りに達しているかどうかだけを調べることができます。