オブジェクト指向言語 オブジェクト指向言語演習

18
オオオオオオオオオオ オオオオオオオオオオオオ オ 15 オ オオオオオオオ

Upload: amaya-contreras

Post on 01-Jan-2016

15 views

Category:

Documents


1 download

DESCRIPTION

オブジェクト指向言語 オブジェクト指向言語演習. 第 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) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: オブジェクト指向言語 オブジェクト指向言語演習

オブジェクト指向言語オブジェクト指向言語演習

第 15 回 ファイル入出力

Page 2: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 2

スケジュール (C 言語 )1. 受講ガイダンスとプログラム開発基礎2. Linux の使い方と簡単な C 言語プログラムの作成,実行3. C 言語 変数と式 (2004/10/04)4. C 言語 制御と流れ (2004/10/04)5. C 言語 変数と式(復習) (2004/10/18)6. C 言語 制御と流れ(復習) (2004/10/18)7. C 言語 関数 (2004/10/25)8. C 言語 配列 (2004/10/25)9. C 言語 第 1 回到達度チェック試験 (2004/11/01)10. C 言語 文字列 (2004/11/01)11. C 言語 第 1 回到達度確認試験説明 (2004/11/15)12. C 言語 配列と文字列の復習 (2004/11/15)13. C 言語 ポインタ (2004/11/22)14. C 言語 構造体とユーザ定義型 (2004/11/22)15. C 言語 ファイル入出力 (2004/11/29)16. C 言語 プログラミング応用 (2004/11/29)17. C 言語18. C 言語19. 中間試験

Page 3: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 3

ファイルの概念 これまでの例題では、すべてキーボードからの入力

( 標準入力 ) を処理して、スクリーン上 ( 標準出力 )に打ち出すというプログラムであった。

ファイルから読み込み、結果をファイルに書き出すことにより、多数のデータを処理することができる。

C 言語により読み込むことのできるファイルは、 テキストファイル

ASCII コードですべて記述されており、テキストエディタなどを利用して編集 (Edit) することができる。

バイナリファイル プログラムが作成するファイルで、一般にはその中身を見

たり、編集したりすることが困難であることが多い。

Page 4: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 4

ファイル入出力 ファイル入出力の手順ファイルを開く( fopen )

ファイルを閉じる( fclose )ファイルへの処理→ →

ファイル入力 ファイル出力 説明

fgetc fputc 一文字入出力

fgets fputs 一行入出力

fscanf fprintf 書式付入出力

ファイルのオープン・クローズ

fopen

説明

ファイルのオープンfclose ファイルのクローズ

getc

gets

scanf

putc

puts

printf

標準入出力

Page 5: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 5

fopen 関数 (1)

与えられたファイル名 filename のファイルを、与えられたモード modemode に従って開く

戻り値 正常オープン時 → ファイルポインタ エラー時   →  NULL

戻り値のファイルポインタは開いたファイルを指し示す重要な役割を担う。

fopen関数は関数の戻り値としてファイルストリームポインタを返すので、エラー処理では NULL(NULLポインタ )が使用される。

FILE *fopen(char *filename, char *mode);

Page 6: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 6

fopen 関数 (2) モード mode

モード

“r”

“w”

“a”

“r+”

“w+”

“a+”

処理

読み込み書き込み追加書き込み

読み+書き(更新)読み + 書き(更新)追加読み書き(更新)

ファイル

存在しない時には  NULL を返す新規作成 (存在するファイルは消去)存在するファイルを利用、なければ作成

存在しない時には  NULL を返す新規作成 (存在するファイルは消去)存在するファイルを利用、なければ作成

Page 7: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 7

fclose 関数

与えられたファイル識別子 (ファイルポインタ ) fp で示されるファイルを閉じる

戻り値 正常クローズ時 →  0 エラー時 →  EOF

int fclose(FILE *fp);

Page 8: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 8

FILE 型構造体 ファイルを取り扱うためには FILE で表される FILE 型

の構造体を利用する。 FILE 型の定義は stdio.h に記述してある。

オープンするファイルごとにファイル型のポインタを宣言する。

FILE *fp1, *fp2;

fp1 = fopen(“input1.dat”,”r”);

fp2 = fopen(“input2.dat”,”r+”);

Page 9: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 9

エラー処理を含むファイルオープン・クローズ fopen 関数は open 時にファイルが存在しないとエラーとして

NULL を返す。これを利用してエラー処理を行う。#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

別の例:if((fp = fopen(“input.txt”,“r”))== NULL ){ printf("error: fopen \n"); exit (EXIT_FAILURE); }

Page 10: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 10

fscanf 関数 int fscanf(FILE *fp,

cont char *format, ....);

与えられたファイルポインタ fp で示されるファイルからフォーマット format で読み込む。

戻り値 正常時  → 入力データ数 エラー時  →  EOF (ファイルの終了)

例 fscanf(fp, “%d”, &x);

これまでの scanfとは最初の引数 fpが違うのみ!!

Page 11: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 11

fprintf 関数 int fprintf(FILE *fp,

cont char *format, ....);

与えられたファイルポインタ fp で示されるファイルにフォーマット format で書き込む。

戻り値 正常時  → 出力文字数 エラー時  → 負の数

例 fprintf(fp, “The number is %d.\n”, x);

これまでの printfとは最初の引数 fpが違うのみ!!

Page 12: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 12

#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);

ファイル読み込みの例 (fscanf)

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;}

scanf でファイルネームをキーボードから入力

fscanf で整数値の読み込みつつ、合計を計算

Filename のファイルを開く

入力ファイルの最後には 0が書き込んであることが仮定されている。

Page 13: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 13

fgets 関数 char *fgets(char *line,

int maxchar, FILE *fp);

与えられたファイルポインタ fp で示されるファイルから一行分を文字配列 line に読み込む。但し、最大読み込み文字数は maxchar-1 文字である。

戻り値 正常時   →  line ファイル終了時  →  NULL エラー時    →  NULL

Page 14: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 14

fputs 関数

int fputs(char *line, FILE *fp);

与えられたファイルポインタ fp で示されるファイルに文字配列 line を書き込む。

戻り値 正常時  → 正の数(不定) エラー時  →  EOF

Page 15: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 15

入力データの終わりの判定 前述の例では、データの終わりの印として最後に 0

を入れていたが、 C 言語ではデータを全て読み込んだか判定する方法がある。

これは、 fscanf がファイルの最後まで読み込んだときに、 EOF を返すことを利用する (fgets では NULL) 。int val;while( fscanf(fp, “%d”, &val) != EOF ){ データの処理}

#define MAXLINE 1024char str[MAXLINE];int cnt = 0;while( fgets(str, MAXLINE, fp) != NULL ){ cnt++;} str に文字列を入れつつ、 cnt で入力行数をカウントす

Page 16: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 16

課題 1

キーボードから入力されたファイル名のファイルを開き、その内容をそのまま表示するプログラムを作成しなさい (oo15-1.c) 。

ヒント: ファイル名をキーボードから入力するのに scanfを利用する。 ファイルからの読み込みには fgets を使い、表示には printf を利用する。

Page 17: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 17

課題 2

pref2.txt というファイルには 1 行に 20 文字以内の県名、 2 つの整数値 ( 人口、面積 ) が入っており、47 行のデータがある。

このファイルを開き、県名、人口密度の形式で画面上に打ち出すプログラムを作成しなさい (oo15-2.c) 。

Hokkaido 5683 83453Aomori 1476 9606Iwate 1416 15278   ........

Okinawa 1318 2271

Page 18: オブジェクト指向言語 オブジェクト指向言語演習

29.Nov.2004 Object Oriented Language - Y.Nagasaka: [email protected] 18

コンパイルと実行 まずはじめに

作業ディレクトリの作成 % mkdir ~/wrk/

% mkdir ~/wrk/oo/

次に 作業ディレクトリへの移動 % cd ~/wrk/oo プログラミング % vi lect01-1.c コンパイル・リンク % gcc -o lect01-1 lect01-1.c 実行 % ./lect01-1

* C言語プログラムのファイル名は、 .c でなければならない

一度実行すればよい

* プログラムが終了しなくなったら Ctrl Ctrl キーを押しながら キーを押しながら cc

を押して強制終了すること注意