180 likes | 253 Vues
オブジェクト指向言語 オブジェクト指向言語演習. 第 15 回 ファイル入出力. スケジュール (C 言語 ). 受講ガイダンスとプログラム開発基礎 Linux の使い方と簡単な C 言語プログラムの作成,実行 C 言語 変数と式 (2004/10/04) C 言語 制御と流れ (2004/10/04) C 言語 変数と式(復習) (2004/10/18) C 言語 制御と流れ(復習) (2004/10/18) C 言語 関数 (2004/10/25) C 言語 配列 (2004/10/25)
E N D
オブジェクト指向言語オブジェクト指向言語演習オブジェクト指向言語オブジェクト指向言語演習 第15回 ファイル入出力
スケジュール(C言語) • 受講ガイダンスとプログラム開発基礎 • Linuxの使い方と簡単なC言語プログラムの作成,実行 • C言語 変数と式 (2004/10/04) • C言語 制御と流れ (2004/10/04) • C言語 変数と式(復習) (2004/10/18) • C言語 制御と流れ(復習) (2004/10/18) • C言語 関数 (2004/10/25) • C言語 配列 (2004/10/25) • C言語 第1回到達度チェック試験 (2004/11/01) • C言語 文字列 (2004/11/01) • C言語 第1回到達度確認試験説明 (2004/11/15) • C言語 配列と文字列の復習 (2004/11/15) • C言語 ポインタ (2004/11/22) • C言語 構造体とユーザ定義型 (2004/11/22) • C言語 ファイル入出力 (2004/11/29) • C言語 プログラミング応用 (2004/11/29) • C言語 • C言語 • 中間試験 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
ファイルの概念 • これまでの例題では、すべてキーボードからの入力(標準入力)を処理して、スクリーン上(標準出力)に打ち出すというプログラムであった。 • ファイルから読み込み、結果をファイルに書き出すことにより、多数のデータを処理することができる。 • C言語により読み込むことのできるファイルは、 • テキストファイル • ASCIIコードですべて記述されており、テキストエディタなどを利用して編集(Edit)することができる。 • バイナリファイル • プログラムが作成するファイルで、一般にはその中身を見たり、編集したりすることが困難であることが多い。 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
ファイル入出力 • ファイル入出力の手順 ファイルを開く (fopen) ファイルを閉じる (fclose) → → ファイルへの処理 ファイルのオープン・クローズ 説明 fopen ファイルのオープン fclose ファイルのクローズ ファイル入力 ファイル出力 説明 標準入出力 fgetc fputc 一文字入出力 getc putc fgets fputs 一行入出力 gets puts fscanf fprintf 書式付入出力 scanf printf Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fopen関数(1) • 与えられたファイル名 filenameのファイルを、与えられたモード modeに従って開く • 戻り値 • 正常オープン時 → ファイルポインタ • エラー時 → NULL • 戻り値のファイルポインタは開いたファイルを指し示す重要な役割を担う。 • fopen関数は関数の戻り値としてファイルストリームポインタを返すので、エラー処理ではNULL(NULLポインタ)が使用される。 FILE *fopen(char *filename, char *mode); Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
モード 処理 ファイル “r” 読み込み 存在しない時には NULLを返す “w” 書き込み 新規作成 (存在するファイルは消去) “a” 追加書き込み 存在するファイルを利用、なければ作成 “r+” 読み+書き(更新) 存在しない時には NULLを返す “w+” 読み + 書き(更新) 新規作成 (存在するファイルは消去) “a+” 追加読み書き(更新) 存在するファイルを利用、なければ作成 fopen関数(2) • モード mode Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fclose関数 • 与えられたファイル識別子(ファイルポインタ) fpで示されるファイルを閉じる • 戻り値 • 正常クローズ時 → 0 • エラー時 → EOF int fclose(FILE *fp); Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
FILE型構造体 • ファイルを取り扱うためにはFILEで表されるFILE型の構造体を利用する。 • FILE型の定義はstdio.hに記述してある。 • オープンするファイルごとにファイル型のポインタを宣言する。 FILE *fp1, *fp2; fp1 = fopen(“input1.dat”,”r”); fp2 = fopen(“input2.dat”,”r+”); Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
エラー処理を含むファイルオープン・クローズエラー処理を含むファイルオープン・クローズ • fopen関数はopen時にファイルが存在しないとエラーとしてNULLを返す。これを利用してエラー処理を行う。 別の例:if((fp = fopen(“input.txt”,“r”))== NULL ){ printf("error: fopen \n"); exit (EXIT_FAILURE); } #include <stdio.h> #include <stdlib.h> int main(void){ FILE fp; int err; fp = fopen(“input.txt","r"); if ( fp == NULL ) { printf("error: fopen \n"); exit (EXIT_FAILURE); } if ((err = fclose(fp))== EOF ) { printf("error: fclose\n"); exit (EXIT_FAILURE); } return 0; } stdlib.hでEXIT_FAILUREが1と宣言されている。 define EXIT_FAILURE 1 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fscanf関数 • int fscanf(FILE *fp, cont char *format, ....); • 与えられたファイルポインタ fpで示されるファイルからフォーマット formatで読み込む。 • 戻り値 • 正常時 → 入力データ数 • エラー時 → EOF(ファイルの終了) • 例 • fscanf(fp, “%d”, &x); • これまでのscanfとは最初の引数fpが違うのみ!! Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fprintf関数 • int fprintf(FILE *fp, cont char *format, ....); • 与えられたファイルポインタ fpで示されるファイルにフォーマット formatで書き込む。 • 戻り値 • 正常時 → 出力文字数 • エラー時 → 負の数 • 例 • fprintf(fp, “The number is %d.\n”, x); • これまでのprintfとは最初の引数fpが違うのみ!! Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
#include <stdio.h> #include <stdlib.h> int main(void){ int val, sum = 0, cnt = 0; FILE *fp; char Filename[FILENAME_MAX]; printf(“Input Filename:”); scanf(“%s”,Filename); if((fp = fopen(Filename,"r“)) == NULL ){ printf("error: fopen \n"); exit(EXIT_FAILURE); } for( cnt = 0; ; cnt++){ fscanf(fp, “%d”, &val); if ( val == 0) break; sum +=val; } if ( cnt > 0 ){ printf(“The sum is %d and the mean is %f .\n”, sum, (float) sum/cnt); } fclose (fp); return 0; } ファイル読み込みの例(fscanf) Filenameのファイルを開く scanfでファイルネームをキーボードから入力 fscanfで整数値の読み込みつつ、合計を計算 入力ファイルの最後には0が書き込んであることが仮定されている。 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fgets関数 • char *fgets(char *line, int maxchar, FILE *fp); • 与えられたファイルポインタ fpで示されるファイルから一行分を文字配列 lineに読み込む。但し、最大読み込み文字数は maxchar-1文字である。 • 戻り値 • 正常時 → line • ファイル終了時 → NULL • エラー時 → NULL Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
fputs関数 • int fputs(char *line, FILE *fp); • 与えられたファイルポインタ fpで示されるファイルに文字配列 lineを書き込む。 • 戻り値 • 正常時 → 正の数(不定) • エラー時 → EOF Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
入力データの終わりの判定 • 前述の例では、データの終わりの印として最後に0を入れていたが、C言語ではデータを全て読み込んだか判定する方法がある。 • これは、fscanfがファイルの最後まで読み込んだときに、EOFを返すことを利用する(fgetsではNULL)。 int val; while( fscanf(fp, “%d”, &val) != EOF ){ データの処理 } #define MAXLINE 1024 char str[MAXLINE]; int cnt = 0; while( fgets(str, MAXLINE, fp) != NULL ){ cnt++; } strに文字列を入れつつ、cntで入力行数をカウントする Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
課題1 • キーボードから入力されたファイル名のファイルを開き、その内容をそのまま表示するプログラムを作成しなさい(oo15-1.c)。 • ヒント: ファイル名をキーボードから入力するのにscanfを利用する。ファイルからの読み込みにはfgetsを使い、表示にはprintfを利用する。 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
課題2 • pref2.txtというファイルには1行に20文字以内の県名、2つの整数値(人口、面積)が入っており、47行のデータがある。 • このファイルを開き、県名、人口密度の形式で画面上に打ち出すプログラムを作成しなさい(oo15-2.c)。 Hokkaido 5683 83453 Aomori 1476 9606 Iwate 1416 15278 ........ Okinawa 1318 2271 Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp
コンパイルと実行 • まずはじめに • 作業ディレクトリの作成 % mkdir ~/wrk/ % mkdir ~/wrk/oo/ • 次に • 作業ディレクトリへの移動 % cd ~/wrk/oo • プログラミング % vi lect01-1.c • コンパイル・リンク % gcc -o lect01-1 lect01-1.c • 実行 % ./lect01-1 * C言語プログラムのファイル名は、.c でなければならない 一度実行すればよい 注意 • * プログラムが終了しなくなったら • Ctrl キーを押しながら c • を押して強制終了すること Object Oriented Language - Y.Nagasaka: nagasaka@cc.it-hiroshima.ac.jp