【第11回】


『内容』

<ファイル操作>

 ファイルにデータを書き込んだり,ファイルからデータを読み出したりすることができる.その場合,その対象ファイルをオープンする必要がある.また,処理が終了した後には,必ずそのファイルをクローズする必要がある.クローズしないとデータが壊れたりするので注意すること.

1. ファイルのオープンとクローズ

 1.1 fopen()

 ファイルを操作する際に,まず,対象ファイルをfopen()file openの略)を使って開かなければならない.その際,そのファイルを読み出しに使うのか,書き込みに使うのかを指定する必要がある.

 1.2. fclose()

 fopen()で開いたファイルを閉じる関数がfclose()file closeの略)である.

 1.3 ファイルポインタ

 ファイルを開いたり,閉じたりする際には,ファイルポインタを使用する.ファイルポインタを宣言する際には,FILEで型宣言をする.
 【例】FILE *fp;

2. ファイルへのデータの書き込みと読み出し

 2.1 putc()getc()

 ファイルに1文字だけを書き込む関数がputc()put characterの略)であり,読み出す関数がgetc()get characterの略)である.

 2.2 fputs()fgets()

 ファイルに文字列を書き込む関数がfputs()file put stringの略)であり,読み出す関数がfgets()file get stringの略)である.

 2.3 fprintf()fscanf()(教科書には載っていない)

 画面に出力する関数にprintf()があったが,このファイル版がfprintf()である.キーボードから入力する関数にscanf()があったが,このファイル版がfscanf()である.両者とも,最初のfはfileの略である.書式指定子の概念は全く同じであり,非常に分かりやすい.

3. その他のファイル操作関数

 3.1 remove()

 ファイル自体を削除する関数がremove()である.

 3.2 rename()

 既存するファイルの名前を変更する関数がrename()である.


以下の節は省略する

 この範囲は,テスト範囲から除外するが,興味のある学生は一読しておくと良い.


『演習』

10.ファイル操作

10.1 ファイル操作の流れ

 データは,ファイルにストリーム(stream:流れ)と呼ばれる概念で保存される.複数行の文字列が入っているデータでは,文字列の間に改行のエスケープシーケンス「\n」が入った一連の文字列となる(教科書p.99の図を参照).
 ファイル操作をする場合は,まず,対象ファイルを開く必要がある.また,ファイル操作が終了した後には,そのファイルを必ず閉じなければならない.
 ファイル・ストリームの最後には,ファイル・ストリームの終わりを表す「EOF」(End Of Fileの略)が入る.


10.2 オープンとクローズ

 ファイルを開いたり,閉じたりする関数がfopen()fclose()である.

10.2.1 fopen()

 ファイルをオープンする関数である.ファイルをオープンする場合,そのファイルを読み出し用とするのか,書き込み用とするのか等を指定する必要がある.これをモードと呼び,主に以下のものが使われる.

 "r" readの略.ファイルを読み出し専用としてオープン.
 "w" writeの略.ファイルを書き込み専用としてオープン.ファイルが存在しない場合,新規に作成される.同名のファイルがある場合は上書きされる.
 "a" addの略.ファイルを書き込み専用としてオープン.ファイルが存在しない場合,新規に作成される.同名のファイルがある場合は,そのファイルの最終データの後ろへ付け加えて書き込まれる.

 ファイルのオープンに失敗した場合には,この関数からは「NULL」(無の意味)が返される.

10.2.2 fclose()

 ファイルをクローズする関数である.ファイルのクローズに失敗した場合には,この関数から「EOF」(End Of Fileの略)が返される.

 教科書p.101の「プログラム10-1」を実行し,その動作を確認せよ.(教科書p.100の表を参照)

 このファイルオープン時エラーチェックを以降のプログラムでも使用すること.


10.3 ファイルへのデータの書き込みと読み出し

 ファイルへデータを書き込む関数はファイル出力関数と呼ばれ,ファイルからデータを読み出す関数はファイル入力関数と呼ばれる.以降,これらの代表的なものについて説明する.

10.3.1 putc()getc()による1文字の書き込みと読み出し

 ファイルに対する1文字のみの書き込みと読み出しに使われる関数がputc()getc()である.

 教科書p.102の「プログラム10-2」を実行し,その動作を確認せよ.(教科書p.102の表を参照)


10.3.2 fputs()fgets()による文字列の書き込みと読み出し

 ファイルに対する文字列の書き込みと読み出しに使われる関数がfputs()fgets()である.

 教科書p.103の「プログラム10-3」を実行し,その動作を確認せよ.(教科書p.103の表を参照)


10.3.3 fwrite()fread()による2進数データの書き込みと読み出し

 省略.



10.3.4 fprintf()fscanf()によるファイルへの書き込みと読み出し
【教科書には載っていないが重要である.テスト範囲に含む.】

 printf()scanf()のファイル入出力用関数がfprintf()fscanf()である.

 以下のプログラムを実行し,実際に,ファイル"score.dat"をテキスト・エディタで開き,その中身を確認せよ.さらに,fopen()のモードを"a"と変更して実行したとき,ファイル"score.dat"のデータがどのように変わるかを確認してみよ.
2回以上実行すること!("w"だと最後の1回分のデータのみで,"a"だと入力した全データが存在するはず.)


      #include<stdio.h>
      #include<string.h>   /* strcmp()を使用するのに必要 */
      main()
      {
       char name[20];
       int m,e,j;
       FILE *fp;

       fp=fopen("score.dat","w");
       /* オープン時エラーチェックをここに記述 */
       while(1){
          printf("Your name (quit: z) = ");
          scanf("%s",name);
          if(strcmp(name,"z")==0)
             break;
          printf(" Math  Eng.  Jap. = ");
          scanf("%d %d %d",&m,&e,&j);
          fprintf(fp,"%-20s %5d %5d %5d\n",name,m,e,j);
       }
       fclose(fp);
      }

 以下のプログラムを実行し,その動作を確認せよ.


      #include<stdio.h>
      main()
      {
       char name[20];
       int m,e,j,status;
       FILE *fp;

       fp=fopen("score.dat","r");
       /* オープン時エラーチェックをここに記述 */
       while(1){
          status=fscanf(fp,"%s %d %d %d",name,&m,&e,&j);
          if(status==EOF)
             break;
          printf("%-20s %5d %5d %5d\n",name,m,e,j);
       }
       fclose(fp);
      }

 【練習1】 1次元配列scoreを下記のデータで初期化し,そのデータを新規ファイルへ保存するプログラムを作成せよ.ただし,fprintf文を用いること.(ヒント:for文を使い,配列のデータを順次ファイルへ保存する)
591006988285576957063

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)

 【練習2】 【練習1】で作成したファイルから全データを読み出し,その平均値を求めよ.ただし,fscanf文を用いること.(答)70.3

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)


10.4 ファイル位置操作関数

 省略.


10.5 その他のファイル操作関数

 使用頻度の高い,ファイルの削除とファイル名の変更を行う関数remove()rename()について示す.

10.5.1 remove()によるファイルの削除

 既存のファイルを削除することができる.

10.5.2 rename()によるファイル名変更

 既存のファイルの名前を変更することができる.

 教科書p.107の「プログラム10-7」を実行し,フォルダ中の"outfile"が削除されたかを確認せよ.(教科書p.107の表を参照)


レポート課題10(授業終了後にアップロード)

 RePORTシステム