プログラミング実習

プログラミング実習
第二十一回
ファイル処理も覚えよう
本日の内容

ファイル処理とは?
– 「ファイルから読み込む」とは?
– 「ファイルに書き込む」とは?
– その時,コンピュータはどんな処理をして
いるの?



ファイルから読み込む処理のC言語
ファイルに書き込む処理のC言語
ファイル読み書き用の関数
ファイル処理とは?

これまでは,「キーボードから文字データ
や数値データを入力する」,「処理結果を
画面に出力する」というプログラムを勉強
してきました。

今回は,「ファイルからデータを入力する」,
「ファイルへデータを出力する」というプロ
グラムを勉強しましょう。
ファイル処理とは?
「ファイルから読み込む」

つまり,この仕組みを勉強するということです。
ファイルの内容を表示します
「ファイルを開く」を選んで
ファイル名を指定して
ファイル処理とは?
「ファイルに書き込む」

つまり,この仕組みを勉強するということです。
「名前を付けて保存」を選んで
新しいファイル名で保存します。
新しいファイル名を入力して
ファイル処理とは?
その時,コンピュータはどう動作しているの?

ファイルを読み込んだり,ファイルに書き込んだり
する時に,コンピュータの中でどのようにデータ処
理されているかを理解すると,C言語でのファイ
ル処理のプログラムが理解しやすくなります。
ファイル処理
命令
??
ファイル処理とは?
その時,コンピュータはどう動作しているの?
メモ帳のための場所
メモ帳が起動されると・・
メインメモリ
(主記憶)
の中に・・・
メモ帳のための領域が作られます。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
ハードディスク等
(補助記憶)の中
のファイルが,そ
のメモリ領域に
読み込まれます。
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
「ファイル」→「開く」を選択し,
ファイル名を指定して開くと,
そのファイルのための
場所が確保され,
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
次に,メモリに読み込まれた内容を画面に表示する方法を考えます。
メインメモリ
画面上の表示
メモ帳のための場所
test.txtの場所
ABC
<手順>
•メモリ内のデータが読み込まれた場所
を指定します。
•その場所から,データを変数へ入力し
ます。
•変数の値をprintf等を使い画面に表示
します。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
メモリ内にファイルが読み込まれると,ファイル
データのどの場所からデータを読み込むのか,
どの場所に新しいデータを加えるのか,メモリ
内で場所の指定をする必要があります。
そこで,ファイルを開いた時,メモリ内での場所
を指定するために特別な変数を用意します。
これを「ファイルポインタ」といいます。
ファイルポインタ
ファイルポインタは,最初はファイルデータの
先頭を指定しています。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
ファィルポインタが指定している場所からデー
タを受け取り,変数へ代入します。この場合
は1行の文字列データを受け取ります。
ファイルポインタの指定場所から1行分のデータ
を受け取り,変数へ代入するには,fgetsを使い
ます。詳しくは後で説明します。
fgets(変数名,最大文字数,ファイルポインタ名)
ファイルポインタ
ABCという1行データが変数へ読み込まれた
後は,ファイルポインタは自動的に次の行の
先頭(まだ読み込んでいない場所)に移動
します。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
ファィルポインタが指定している場所からデー
タを受け取り,変数へ代入します。この場合
は1行の文字列データを受け取ります。
ファイルポインタの指定場所から1行分のデータ
を受け取り,変数へ代入するには,fgetsを使い
ます。詳しくは後で説明します。
fgets(変数名,最大文字数,ファイルポインタ名)
ファイルポインタ
ABCという1行データが変数へ読み込まれた
後は,ファイルポインタは自動的に次の行の
先頭(まだ読み込んでいない場所)に移動
します。
これを繰り返してデータを変数へ読み込みます。
変数値はprintfなどで画面に表示されます。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
「名前を付けて保存」を選んで
ファイルポインタ①
test2.txtの場所
新しいファイル名を入力すると・・・
ファイルポインタ②
新しいファイル名の領域が確保されて,
ファイルポインタも別のものが用意されます。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?
メインメモリ
メモ帳のための場所
test.txtの場所
ABC
ファイルポインタ①
test2.txtの場所
DEF
ファイルポインタ②
fgetsなどで,変数へ代入され,処理が
加えられている(例:文字の書き換えなど)
とします。
書き換えられた変数値が,新しいファイル
の場所,ファイルポインタが指している場所
に書き込まれます。fputsなどが使われます。
注意:上書き保存の時は,元のtest.txtの場所
ファイル処理を終了する命令
があったり,メモ帳自体を終
了する時に,補助記憶へ書
き込まれます。
ファイル処理とは?
その時,コンピュータはどう動作しているのか?


以上の,コンピュータ内での動作を整理します。
ファイルを「開く」時
– 開くファイル名を入力する。
– メモリ内に領域が確保され,HDDなど補助記憶装置のファイルデータ
がその領域にコピーされる。
– メモリ上でのファイルデータの位置を表すファイルポインタ(fp)が割り
当てられる。
– fpの位置からデータを変数へ読み込み,変数値を画面に表示したり
処理したりする。

ファイルに「保存する」(書き込む)時
–
–
–
–

保存するファイル名を指定する。
メモリ内に領域が確保され,fpが割り当てられる。
fpの位置にファイル保存したい変数値が書き込まれる。
ファイル処理を終了したり,プログラム自体を終了した時,メモリ上の
内容が,HDDなど補助記憶装置にファイルとして保存される。
どちらの場合も,直接,補助記憶装置内のデータを処理している
わけではないことに注意!
ファイルから読み込む処理
C言語でどう書くか?

ファイルを「開く」時
– 開くファイル名を入力する。
char filename1[80]; gets(filename1);
– メモリ内に領域が確保され,HDDなど補助記憶装置のファイル
データがその領域にコピーされる。
– メモリ上でのファイルデータの位置を表すファイルポインタ(fp)
が割り当てられる。
FILE *fin; fin = fopen(filename1, “r”);
– fpの位置からデータを変数へ読み込み,変数値を画面に表示
したり処理したりする。
char buf[256]; fgets(buf, 256, fin); printf(“%s”, buf);
ファイルから読み込む処理
C言語でどう書くか?

演習
– ファイル名を入力し,そのファイルの内
容を画面に表示するプログラムです。
– ensyu63.cを実行してください。
– 入力するファイル名には,smp1.txtを
指定してください。
– smp1.txtとは異なるファイル名を指定
した場合の動作を確認してください。
ファイルから読み込む処理
C言語でどう書くか?
FILE *fin; ファイルポインタの宣言。FILEという型で,*をつけて宣言します。
char buf[256]; 文字列を入れるための変数の宣言。最大256文字。
char filename1[80]; 文字列を入れるための変数。最大80文字。
ファイル名を保存する変数として利用。
printf("入力ファイル名=");
gets(filename1); ファイル名を入力。
filename1で指定されたファイルを,rモード
(read : 読み込み)でopen(メモリ領域にコ
ピー)し,ファイルポインタfinを割り当てる。
fin = fopen(filename1, "r");
if(fin == NULL){
printf("%sをオープン出来ません\n",filename1);
exit(1);
もし,その名前のファイルが無かったら,fopen関数はNULLを
}
返す。よって,finがNULLだったらファイルが開けない,という
ことになり,exit(1)で強制終了する。
ファイルから読み込む処理
C言語でどう書くか?
ファイルポインタfinが指している場所から
1行分の文字列データ(ただし最大256文字)を
読み込み,変数bufに代入する。
while(fgets(buf, 256, fin) != NULL){
printf("%s", buf);
読み込む文字列がNULLになるまで
}
=行が無くなるまで,繰り返し処理。
bufに読みまれた文字列を
画面に表示する
fclose(fin);
ファイルの内容(文字データ)を画面に表示する処理。
ファイル処理が終わったらクローズする。
ファイルポインタがそのファイルから解放
されてメモリ上からファイル内容が消える
ファイルに書き込む処理
C言語でどう書くか?

ファイルに「保存する」(書き込む)時
– 保存するファイル名を指定する。
char filename2[80]; gets(filename2);
– メモリ内に領域が確保され,fpが割り当てられる。
FILE *fout; fout = fopen(filename2, “w”);
– fpの位置にファイル保存したい変数値が書き込まれる。
char buf[256]; fputs(buf, fout);
– ファイル処理を終了したり,プログラム自体を終了した時,メモ
リ上の内容が,HDDなど補助記憶装置にファイルとして保存さ
れる。
fclose(fout);
ファイルに書き込む処理
C言語でどう書くか?

演習
– ファイル名を入力し,そのファイルの内容を別のファ
イル名でファイル保存するプログラムです。
– つまり,ファイルのコピーをするプログラムです。
– ensyu64.cを実行してください。
– 入力するファイル名には,smp1.txtを指定してくださ
い。出力ファイル名は任意で結構ですが,最後
は.txtで終わるようにして下さい。
– 出力されたファイルを,ensyu63.cで開くか,または
メモ帳で開いて,内容がコピーされている事を確認
してください。
ファイルに書き込む処理
C言語でどう書くか?
fout = fopen(filename2, "w");
if(fout == NULL){
printf("%sをオープン出来ません\n",filename2);
exit(1); filename2で指定されたファイルを,wモード(write : 書き込み)
}
でopen(空のメモリ領域を準備)し,ファイルポインタfoutを割り
当てる。
while(fgets(buf, 256, fin) != NULL){
fputs(buf, fout);
}
fclose(fin);
fclose(fout);
ファイルポインタfoutが指している場所に,文字列変数buf
に保存されている1行分の文字列データを書き込む。
ファイルポインタは自動的に次の行の先頭を指す。
クローズする事で,そのファイルが補助記憶装置に保存される。
ファイル処理:演習


ファイルを開き,その内容を画面に表示し
て,新たな文字列を追加した上で,ファイ
ル名をつけて保存するプログラムを考え
ましょう。
ensyu65.cを完成させてください。
ファイル読み書き用の関数

どの関数も,「stdio.h」に定義されています。
関数名
説明
char fgetc(FILE *fp)
1文字をfpの位置から読み込み,返り値として返す。
fputc(char ch, FILE *fp)
fgets(char buf[], int x, FILE *fp)
fputs(char buf[], FILE *fp)
fscanf(FILE *fp, format, &変数 )
fprintf(FILE *fp, format, 変数)
chで示す1文字をfpの位置に書き込み
fpの位置から最大x文字の文字列を文字列配列buf
に読み込み。
fpの位置に文字列配列bufを書き込み。
fpの位置から書式formatで読み込み,変数へ代入。
変数の値を書式formatでfpの位置に書き込み。
*詳しくは,アドバンストプログラミングで学習します。
ファイル読み書き用の関数
fscanfとfprintfを利用したプログラム


fprintfとfscanfは,特にintやdoubleなどの数値データ
のファイル入出力に便利な関数です。
これまで使っていた,printfやscanfに,ファイルポインタ
を指定する引数を追加するだけで,そのファイルへの
書き込み,ファイルからの読み込みを実現出来ます。
scanf(“%d”, &x);
キーボードから整数データxを入力
fp=fopen(filename, “r”);
fscanf(fp, “%d”, &x);
filenameで指定されたファイルから
整数データをxへ読み込み
printf(“値は%dです\n”, x);
画面へ「値は*です」とxの値を出力
fp=fopen(filename, “w”);
fprintf(fp, “値は%dです\n”, x);
filenameで指定されたファイルへ「値は
*です」とxの値を書き込み
ファイル読み書き用の関数
fscanfとfprintfを利用したプログラム

演習
– tokuten.txtには,20人分のテストの得点が
保存されています。
– これらの整数データをfscanfを使って読み込
み,この平均値を計算するプログラムを作成
しなさい。
– ensyu66.cを完成させなさい。
ファイル読み書き用の関数
fscanfとfprintfを利用したプログラム

演習
– name.txtには,20人分の氏名が保存されています。この氏名
データと,tokuten.txtに保存されている得点データを併せて,
下のような1つのデータファイルにして下さい。
– 2つのファイルそれぞれから,fscanfを利用して配列変数に
データを入力し,これら変数値をfprintfを利用して1つのファイ
ルへ書式付きで出力します。
– ensyu67.cを完成させなさい。作成したファイルが正しい形式
になっているか,メモ帳などを使って確認しなさい。
氏名1
氏名2
氏名3
・・・・
・・・・
得点1
得点2
得点3
作成するデータ
ファイルの中身
ファイル読み書き用の関数
fscanfとfprintfを利用したプログラム

演習
– ensyu67.cを実行して作成されたファイルか
ら,氏名と得点を読み込み,画面に表示する
プログラム作りなさい(kadai2.c)。
復習問題

繰り返しの復習
– 0~100まで,整数の総和を求めるプログラ
ムは?
– For文とif文の両方で作ってみよう

関数の復習
– 四捨五入をする関数roundoffを作ってみよう
定期試験について

次の回を中心に学習して下さい。
– 11回目(for文とwhile文)
– 15回目~17回目(基本的な関数)
– 18回目~19回目(文字列の標準ライブラリ
関数)

穴埋め,出力予想,フローチャートからの
プログラム作成
冬期課題




自分自身のオリジナルのプログラムを作
ってメールで提出して下さい。
[email protected]
10点を上限として採点して加点します。
提出は自由です。
締め切りは1/15日金曜日とします。