プログラミング入門2
芝浦工業大学情報工学科
青木 義満
ファイルの入出力
今回の講義内容
ファイル入出力
ファイルからのデータ読込み
ファイルと配列
プログラミング入門2 3
ファイルへのデータ書き込み(復習)
ソースファイル名:fileio1.c
データをファイルに書き込み
#include <stdio.h> int main(void) { FILE *fp; int student_id = 100; char name[ ]= "morishima"; double tensu = 95.5;fp = fopen("test.txt","w");
fprintf( fp, "%d¥n", student_id ); fprintf( fp, "%s¥n", name ); fprintf( fp, "%f¥n", tensu );
fprintf( fp, "%d %s %f¥n", student_id, name, tensu ); fprintf( fp, "%d¥t%s¥t%f¥n", student_id, name, tensu );
fclose(fp); return(0); }
ファイルポインタ宣言
ファイルに書き込むデータ “test.txt”という名前でファイルをオープン (書き込み用) データをファイルに書き込み ファイルを閉じる 100 morishima 95.5ファイルからのデータの読込みの必要性
ファイルに格納されているデータを,プログラム中に
読み込んで処理
1 aoki 80.5 100 morishima 95.5 50 tokunaga 70.4 ・・・・・・ ・・・・・・ ・・・・・ ・・・・・ファイル~成績表リスト
int student_id[NUMBER]; char name[NUMBER][256]; double score[NUMBER]; ・・・・・・・・・・・ ・・・・・・・・・・ ・・・・・・・・・・ ・・・・・・・・・・プログラム~xxx.c
プログラミング入門2 5
データの作成(野球選手成績リスト)
ソースファイル名:player1.c
チーム名,選手名,ホームラン数をファイルに書き込み
#include <stdio.h> #define NUM 100 /* 最大100人までの選手データを扱う */ int main(void) { FILE *fp; char team[NUM][256]; char name[NUM][256]; int hr[NUM]; int i; fp = fopen("player.txt","w"); /* キーボードから選手データを読込み */ for(i=0; i < 5; i++){printf("Input Players' Data¥n"); printf("Team : "); scanf("%s", team[i]); printf("name : "); scanf("%s", name[i]); printf("Homerun : "); scanf("%d", &hr[i]); } for(i=0; i < 5; i++){ /* 読み込んだデータを画面表示 */ printf( "%s %s %d¥n", team[i], name[i], hr[i]); /* 読み込んだデータをファイルへ書き込み */ fprintf( fp, "%s %s %d¥n", team[i], name[i], hr[i]);
} fclose(fp); return(0); } G Matsui 50 L Matsui 33 D Fukudome 20 ・・・・・・ ・・・・・・ ・・・・・ ・・・・・
player.txt
ファイルからのデータの読み込み
ファイルからデータを読み込む際の手順
ファイルを開く (読込みモードで)
変数へのデータの読込み
fscanf関数等を使用
ファイルを閉じる
プログラミング入門2 7
ファイルを開く ~ fopen関数
データを読み込む対象の
”ファイル名” を指定
読み込みモードを指定(2つ目の引数に”r”を指定)
読み込みモードでファイルを開く操作
FILE *fp;
fp = fopen( “file.txt”, “r” );
file.txt
(ファイル)
FILE *fp
(ファイルポインタ)
ファイル名
読込みモード ファイルを指定fp を介して,ファイルにアクセスが可能!
ファイルを開く際のモードの種類 (テキストファイル)
モード
意味
“r”
読込み用にファイルを開く。ファイルが存在しない場合や
見つからない場合は失敗する。
“w”
書き込み用にファイルを作成。ファイルが存在する場合は
そのファイルの内容は破棄する。
“a”
追加書き込みのために既存ファイルを開く。ファイルが存
在しない場合には作成する。
“r+”
読み書き用にファイルを開く。ファイルは存在していなけ
ればならない。
“w+”
読み書き用にファイルを作成。ファイルが存在する場合に
は,そのファイルの内容は破棄する。
“a+”
読込みと追加の両方のモードでファイルを開く。ファイル
が存在しない場合は作成する。
プログラミング入門2 9
ファイルからのデータの読込み
~ fscanf関数
scanf関数(キーボードからのデータ入力)
→
f
scanf関数(
f
ileからのデータ入力)
fscanf関数の書式
scanf関数
scanf( “%d”, &x);
fscanf関数
fscanf( fp, “%d”,
&
x );
データを読み込む対象の のファイル(ポインタ)100
file.txt
fp = fopen( “file.txt”, “r” );
プログラム中の変数
int x
fscanf
fscanf関数の使用例
実数データの読み込み
文字列データの読込み
1行に並んでいる複数の型のデータを読み込み
ファイル:fscanf( fp, “%lf”, &x );
文字配列1つ:
char name[256] ← fscanf( fp, “%s”, str );
複数の文字配列:
char name[5][256] ←
fscanf( fp, “%s”, str[i] );
プログラミング入門2 11
ファイルを閉じる
使い終わったら,後片付け
ファイルを閉じる
ファイルを開く時に指定したファイルポインタを指定
fclose(fp);
ファイルからのデータの読込み 例題
ソースファイル名:player2.c
データをファイルから読み込み,変数に格納, 表示
#include <stdio.h> #define NUM 100 int main(void) { FILE *fp; char team[NUM][256]; char name[NUM][256]; int hr[NUM]; int i; fp = fopen("player.txt","r"); /* ファイルから選手データを読込み */ for(i=0; i < 5; i++){fscanf(fp, "%s %s %d", team[i], name[i], &hr[i]); }
for(i=0; i < 5; i++){
/* 読み込んだデータを画面表示 */
printf( "%s¥t%s¥t%d¥n", team[i], name[i], hr[i]); } fclose(fp); return(0); } 読込みモードで ファイルをオープン
プログラミング入門2 13
入出力ファイル名の指定
これまでのプログラム
入出力ファイル名をプログラム中で指定
ファイル名の指定
fp = fopen("player.txt","r");
キーボードからファイル名を指定できれば便利!
char filename[256];
printf(“input filename : ”);
scanf( “%s”, filename );
fp = fopen(
filename
, “r” );
ソースファイル名:filename.c
ファイル名を指定して開く
入出力ファイル名の指定 例題
#include <stdio.h> int main(void) { FILE *fp;char filename[256];
printf( "Input file name : " );
scanf( "%s", filename );
ファイル名格納用変数
キーボードから入力した文字列を filenameに格納
プログラミング入門2 15
ファイルが開けるかどうかのチェック
fopen関数 の仕様
ファイルが開けるかどうかの判定
fp = fopen(filename, "r");
fpにそのファイルを指定するファイルポインタを格納
(fpには,そのファイルを指定可能にするための何らかの値が入る)
ファイル”filename”が存在し,開ける場合
fpにはNULL(空)が代入される
ファイル”filename”が存在しない,開けない場合
fp = fopen(filename, “r”)
== NULL
== それ以外の値
if文を使って判定
ファイルが開けるかどうかのチェック 例題
ソースファイル名: filecheck.c
指定したファイルが開けるかどうかを判定
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char filename[256];printf( "Input file name : " ); scanf( "%s", filename );
if( (fp = fopen(filename, "r") ) == NULL ){
printf("指定したファイル%sは開けません¥n", filename); printf("プログラムを終了します¥n");
exit(1); }
else{
printf( "file open成功!¥n" );
printf( "ファイル名は%sです", filename ); ヘッダーを追加(exit関数使用のため) フ ァ イ ル が 開 け る か ど う か の 判 fp=NULL, ファイルが開けなかった場合 プログラムを終了 fp != NULL : ファイルが開けた場合
プログラミング入門2 17
演習課題
以下のようなサッカー選手のデータファイルをエディタ(emacs)で作成せよ。そ
のファイルから,選手名,アシスト数,ゴール数を読み込み,アシスト王,得
点王,MVP(アシスト+得点がMAX)の選手を判定し,画面に結果を表示
するプログラムを作成せよ。
(kadai8.c)
選手数は各自で決めて良い
最大値を求める関数を自分で設計し、使用すること
Takahara 7 20
Nakayama 5 13
Magron 2 8
Kazu 6 10
・・・・・・・
・・・・・・・
名前 アシスト ゴールファイル:player.txt
今日は1問のみ.前回までの課題チェックを今日中に終えること!!
【重要】中間テストについて
日時:11月24日(月)13:00~14:00
テスト終了後に、ホームルーム実施
場所:3401教室
試験範囲
最初~第6回(関数)まで
プログラミング入門2 19