14回目の授業


12回目の課題について



第13章

定期試験について



 テキスト(新・明解C言語 入門編)のみ持込は可とします。他の参考書類,ノート,プリンタの出力の持込はできません。

 授業の課題で,どんなプログラムを作ったか,きちんと復習しておいてください。また,授業のwebページについては,全てを必ず熟読しておいてください。そして...

覚えるのではなく,原理を理解することが重要です。

特に,以下の項目について,その“原理”をよく“理解”しておいて下さい。

ファイルの読み書きの基本



 ファイルの読み書きをするために必要な作業のフローをおおまかに表すと,以下のようになります。

まず 関数 fopen( ) でファイルを"開きます"。

実際のデータの"書き込み",または"読み込み"のコードを書きます。

処理が終ったら,関数 fclose( ) でファイルを"閉じます"。

 実際のデータの書き込み,読み込みのやり方(そのための関数)は,何種類かありますが,この授業では,

読み込みのための関数として,
fscanf( )

書き込みのための関数として,
fprintf( )

のみ,学ぶことにします。


fopen( ) でファイルを"開く"

 fopen()という関数は,ファイル名を受け取って,OSとかと何らかのやり取りをして,ファイルの読み書きをするのに必要なデータが納められているメモリ上のアドレス(すなわちポインタ)を返します。

 このポインタは,ファイル・ポインタと呼ばれ,バッファの位置,バッファ内の現在の文字の位置,ファイルが読み書きのどちらをされるのか,エラーあるいはファイル終端が起きたのか,といったファイルに関する情報を含む構造体を指します。

このファイルに関する構造体は, <stdio.h>内でFILE型として定義されています。ユーザはFILE型の詳細については知る必要はありません。単に以下のような使い方をするだけで十分です。

 まず宣言部で,
    FILE *fp;
といったように,FILE型へのポインタ(ここでは変数名 fp としている)を宣言します。これで,FILE型へのポインタ型の変数として,fp が使用できるようになります。もし,別の変数名を使って,
    FILE *xxxx;
と宣言した場合には,以下では fp を全て xxxx で読み替えてください。

 次に,ファイルを開く(openする)ために,
    fp = fopen(filename, mode);
というコードを書きます。ここで, filenameには実際のファイル名を,文字リテラル(文字列の定数)や文字列(char型の配列)で与えます。
また,mode には,

読み込み(read)時は"r"

書き込み(write)時には"w"

と書きます。

 fopen( ) は,FILE型へのポインタ型を返してきますので,それを,先程宣言しておいた,変数 fp に代入しておきます。(この変数 fp は,後で実際にファイルに読み書きするときに使用します。)

もし,読み込むファイルがない(引数で与えたファイル名のファイルが存在しない)等のエラーが発生した場合には,fopen( ) は,NULL(\0)を返してきます。よって,その場合には,別のファイル名を与え直してみるといった処理をしたり,あるいはプログラムをその時点で終了するようにコードを書けばよいでしょう。


fscanf( ) でファイルから"読み込む",fprintf( ) でファイルに"書き出す"

 fopen( ) でファイルを開いたら,FILE型へのポインタ型である変数 fp に向けて,実際にデータを読み書きする作業をします。

fscanf( ) と,fprintf( ) の使い方は,以下のようにします。
    fscanf(fp, format, ...);
    fprintf(fp, format, ...);
format 以降は, scanf( )printf( ) と全く同じ書き方をします。

関数名の最初にfがつくのと,関数の最初の引数としてfpが余分に必要となるのが違うだけです。

つまり,
scanf( )
は,キーボードからデータを入力するために使う関数ですが,

キーボードの換わりにファイルからデータを入力するために使う関数が,
fscanf( )
であるというわけです。

同様に,
printf( )
は,データを画面に表示するために使う関数ですが,

画面の換わりにファイルにデータを出力するために使う関数が,
fprintf( )
であるというわけです。

 fscanf( )fprintf( ) の使い方のコツとしては,以下のようになります。
  1. まず,画面表示(キーボード入力)するつもりで,printf( )scanf( ) )を使ったコードをためしに書いておいて,

  2. そのコードが適切に動作したのを確認したら(自分の意図したとおりに画面表示されたら),関数名の頭に f をひっつけ,引数に fp (ファイル・ポインタ)を追加する

  3. すると,画面表示(キーボード入力)されていたものが,そのまま,ファイルにテキストデータとして,書き込まれる(読み込まれる)ことになる


fclose( ) でファイルを"閉じる"

 最後に,ファイルを閉じるときはただ単に,
    fclose(fp);
と書くだけです。この操作をし忘れると,せっかく作ったファイルが壊れる可能性がありますので,必ず忘れずに行って下さい。


今日の実習問題と宿題




春休みのための推薦図書:


戻る