プログラミング論Ⅰ

Download Report

Transcript プログラミング論Ⅰ

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