プログラミング論Ⅰ

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