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