32
第 14 第 第第第第第第 14.1 フフフフフフフフフフ 14.2 フフフフフフフフフフフ 14.3 フフフフフフフフフフフフ 14.4 フフフフフフフフ 14.5 フフフフフフフフフフフフフフ 14.6 フフフフフフフ 14.7 フフフフフフフフフフフフフ

第 14 章 ファイル操作

Embed Size (px)

DESCRIPTION

第 14 章 ファイル操作. 14.1  ファイルへの書き込み 14.2  ファイルからの読み込み 14.3  ファイルへの追加書き込み 14.4  ファイル名の指定 14.5  複数のファイルの同時オープン 14.6  ファイルの構造 14.7  その他のファイル入出力関数. 14.0  はじめに. これまでのプログラミングの学習では、 入力データは プログラム中で設定 キーボードから入力. 結果は画面に表示. データを入力してください。. 3 8. 和は 11. いわば、その場限りの処理だった …. 14.0  はじめに. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 14 章 ファイル操作

第 14 章 ファイル操作

14.1 ファイルへの書き込み14.2 ファイルからの読み込み14.3 ファイルへの追加書き込み14.4 ファイル名の指定14.5 複数のファイルの同時オープン14.6 ファイルの構造14.7 その他のファイル入出力関数

Page 2: 第 14 章 ファイル操作

14.0  はじめに

結果は画面に表示

データを入力してください。

いわば、その場限りの処理だった…

これまでのプログラミングの学習では、入力データは

プログラム中で設定 キーボードから入力

3 8

和は 11

Page 3: 第 14 章 ファイル操作

一般的なプログラミングでは、入力データは

Excel 等のアプリケーションで作成 画像や音声ファイル キーボードから入力

プログラム中でファイルの操作が必要

14.0  はじめに

結果は別のファイルに

保存

Page 4: 第 14 章 ファイル操作

ファイルへのデータの書き込みFILE *fp;

fp=fopen(" ファイル名 ", "w");

fprintf(fp, " 書式指定子 ", 書き込む変数 );

fclose(fp);

ファイルからのデータの読み込みFILE *fp;

fp=fopen(" ファイル名 ", "r");

fscanf(fp, " 書式指定子 ", & 読み込む変数 );

fclose(fp);

今日のポイン今日のポイントト

Page 5: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; a = 2.345; b = 5.678; sum = a + b; fp = fopen("foo.txt", "w"); fprintf(fp, "%f, %f, %f¥n", a, b, sum); fclose(fp); return 0;}

1. ファイルポインタの宣言 FILE 型のポインタ変数 fp

プログラム例 14.1.1

14.1  ファイルへの書き込み

Page 6: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; a = 2.345; b = 5.678; sum = a + b; fp = fopen("foo.txt", "w"); fprintf(fp, "%f, %f, %f¥n", a, b, sum); fclose(fp); return 0;}

2. ファイルを開く foo.txt はファイル名 w は書き込みのファイルモード

プログラム例 14.1.1

14.1  ファイルへの書き込み

ファイル識別子を txt にしておくとダブルクリックによりメモ帳で開くことができる

Page 7: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; a = 2.345; b = 5.678; sum = a + b; fp = fopen("foo.txt", "w"); fprintf(fp, "%f, %f, %f¥n", a, b, sum); fclose(fp); return 0;}

プログラム例 14.1.1

14.1  ファイルへの書き込み

3. ファイルにデータを書き込む fp で書き込むファイル( foo.txt )

を指定 あとは printf と同じ

Page 8: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; a = 2.345; b = 5.678; sum = a + b; fp = fopen("foo.txt", "w"); fprintf(fp, "%f, %f, %f¥n", a, b, sum); fclose(fp); return 0;}

必ず閉じること!

プログラム例 14.1.1

14.1  ファイルへの書き込み

4. ファイルを閉じる

実行後に例 14.1.1 のフォルダ内にfoo.txt ができていることを確認する

Page 9: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; fp=fopen("foo.txt", "r"); fscanf(fp, "%lf, %lf, %lf¥n", &a, &b, &sum); printf("a=%f, b=%f, sum=%f¥n", a, b, sum); fclose(fp); return 0;}

プログラム例 14.2.1

14.2  ファイルからの読み込み

1. ファイルポインタの宣言 FILE 型のポインタ変数 f

p2. ファイルを開く foo.txt はファイル名 r は読み込みのファイル

モード

実行前に例 14.1.1 でできた foo.txt を 例 14.2.1 のフォルダにコピーしておく

Page 10: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; fp=fopen("foo.txt", "r"); fscanf(fp, "%lf, %lf, %lf¥n", &a, &b, &sum); printf("a=%f, b=%f, sum=%f¥n", a, b, sum); fclose(fp); return 0;}

プログラム例 14.2.1

14.2  ファイルからの読み込み

3. ファイルからデータを読み込む fp で読み込むファイル( foo.txt )

を指定 あとは scanf と同じ

実行前に例 14.1.1 でできた foo.txt を 例 14.2.1 のフォルダにコピーしておく

Page 11: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; fp=fopen("foo.txt", "r"); fscanf(fp, "%lf, %lf, %lf¥n", &a, &b, &sum); printf("a=%f, b=%f, sum=%f¥n", a, b, sum); fclose(fp); return 0;}

必ず閉じること!

プログラム例 14.2.1

4. ファイルを閉じる

14.2  ファイルからの読み込み

実行前に例 14.1.1 でできた foo.txt を 例 14.2.1 のフォルダにコピーしておく

Page 12: 第 14 章 ファイル操作

14.3  ファイルへのデータの追加プログラム例 14.3.1#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; a = 1.134; b = 2.567; sum = a + b; fp=fopen("foo.txt", "a"); fprintf(fp, "%f, %f, %f¥n", a, b, sum); fclose(fp); return 0;}

既存のファイルにデータを書き込む fp で書き込むファイル( foo.txt )

を指定 "a" なら foo.txt の EOF から書き

込むモード( a は append の意)

実行前に例 14.1.1 でできた foo.txt を 例 14.3.1 のフォルダにコピーしておく

実行後に例 14.3.1 のフォルダにある foo.txt の追加内容を確認

Page 13: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; char rfile[15]; FILE *fp; printf("データの保存されたファイルの名前を入力して下さい ."); gets(rfile); fp=fopen(rfile, "r"); fscanf(fp, "%lf, %lf, %lf", &a, &b, &sum); printf("a=%f, b=%f, sum=%f¥n", a, b, sum); fclose(fp); return 0;}

14.4  ファイル名を指定プログラム例 14.4.1

文字列 rfile にファイル名を読み込む

実行前に例 14.1.1 でできた foo.txt を 例 14.4.1 のフォルダにコピーしておく

実行時には foo.txt を入力

Page 14: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ double a, b, sum; FILE *fp; if ((fp = fopen("baz.dat", "r")) != NULL) { fscanf(fp, "%lf, %lf, %lf¥n", &a, &b, &sum); printf("a=%f, b=%f, sum=%f¥n", a, b, sum); fclose(fp); } else printf("ファイルが存在しません .\n"); return 0;}

14.4  ファイル名の確認プログラム例 14.4.2 ファイルポインタ fp が NULL でない .

( baz.dat というファイルが存在する)なら真→ ファイルからデータを読み込む部分に進む .!= は「等しくない」という関係演算子( p.182 )

ファイル読み書きに良く使う文なので、マスターしよう

Page 15: 第 14 章 ファイル操作

fopen("baz.dat", "r")

14.4  ファイル名の確認の詳細

fp=fopen("baz.dat", "r")

baz.dat が同じフォルダに存在する  →  baz.dat へのポインタbaz.dat が同じフォルダに存在しない →   NULL

ファイルポインタ fp に fopen 関数の値( baz.dat へのポインタか NULL )を代入

fp が NULL と等しくない時 → 真 (1) NULL の時       → 偽 (0)if ((fp=fopen("baz.dat", "r")) != NULL)

もし、ポインタ変数 fp が NULL でない(= baz.dat というファイルが存在)なら真  →  ファイルからデータを読み込む部分に進む

(fp=fopen("baz.dat", "r")) != NULL

Page 16: 第 14 章 ファイル操作

14.4  ファイル終端の検出

fscanf 関数の値が EOF と等しくない( = fp が指すファイルの終端でない)間は、 { } を繰り返す

プログラム例 14.4.3

実行前に例 14.4.3 のフォルダに p.135 の最下段のデータをメモ帳で作成し、foo.txt という名前で保存

#include <stdio.h>int main(void){ double x[100], y[100]; int i; FILE *fp; fp = fopen("foo.txt", "r"); i = 0; while (fscanf(fp, "%lf, %lf", &x[i], &y[i]) != EOF) { printf("%f, %f\n", x[i], y[i]); i++; } fclose(fp); printf("ファイル中のデータ (x, y) の数は %d 組です .\n", i); return 0;}

Page 17: 第 14 章 ファイル操作

fscanf(fp, "%lf, %lf", &x[i], &y[i])

14.4  ファイル終端の検出の詳細

fp が指すファイルにデータがある場合 → データを読み込んで配列 x, y に代入するfp が指すファイルにこれ以上のデータがない(ファイル終端)、または何らかのエラーの場合 →  EOF

while (fscanf(fp, "%lf, %lf", &x[i], &y[i]) != EOF) { …}

fscanf 関数の値が EOF と等しくない( fp が指すファイルの終端でない)間は、 {…} を繰り返す。

Page 18: 第 14 章 ファイル操作

#include <stdio.h>int main(void){ FILE *ifp, *ofp; double a, b, sum; ifp = fopen("foo.txt", "r"); ofp = fopen("bar.txt", "w"); while (fscanf(ifp, "%lf, %lf", &a, &b) != EOF) { sum = a + b; fprintf(ofp, "%f, %f, %f¥n", a, b, sum); } fclose(ofp); fclose(ifp); return 0;}

14.5  複数のファイルを同時に開く

読み込むファイル、書き込むファイルを

指すポインタ

プログラム例 14.5.1

両方とも閉じる

実行前に例 14.4.3 で作成した foo.txt を 例 14.5.1 のフォルダにコピーしておく

実行後に例 14.5.1 のフォルダにbar.txt ができていることを確認する

Page 19: 第 14 章 ファイル操作

興味のある人は 第 16 章 構造体 を自習してください .「データ構造とアルゴリズム」や「演習 II 」で本格的に取り組むはず .

学籍番号 氏名 1科目 の得点 2科目 の得点 3科目 の得点1001 Arai Satoshi 90 70 5

1005 Inoue Makoto 65 85 75

1013 Kawada Keiko 77 89 97

1件分をレコードという

実際には、以下の例のような構造を持つファイルが多い

14.6  ファイルの構造

このようなファイルを「シーケンシャルアクセスファイル」という

各項目をフィールドという

Page 20: 第 14 章 ファイル操作

14.7 その他のファイル入出力関数 プログラム例 14.7.1 はファイル間のコピー ファイルコピーは OS上( Windows ならエ

クスプローラ)でファイルを複製するほうが実際的

主な入出力関数は p.185 に掲載 興味のある人は、いろいろ試してみよう

Page 21: 第 14 章 ファイル操作

1. y = 2x2 + 3 (10 ≦ x 10) ≦ を刻み幅 1 で計算し、 x, y の組を1行ごとにファイル( data1.txt )に書き込むプログラム (q14_1.c) を作成せよ。 ( プログラム例 14.1.1 参照 )

2. コンパイル・実行して Z:\nyumon2 フォルダ内に data1.txt ができているか、エクスプローラで確認せよ

3. アイコンをダブルクリックしてデータを確認せよこんなファイルをつくる

演習問題 14.1 (レポートの準備)

                                           

Page 22: 第 14 章 ファイル操作

i を用いた x の式x を用いた y の式

演習問題 14.1 のヒント#include <stdio.h>int main(void){ int i; double x, y; FILE *fp; fp=fopen("data1.txt", "w"); for (i = -10; i <= 10; i++) {

fprintf(fp, "%f, %f\n", x, y); } fclose(fp); return 0;}

Page 23: 第 14 章 ファイル操作

スキルアップタイム 1 (レポート課題)以下の機能を持つプログラム (q14_s1.c) を作成せよ1. 演習 14.1 で作ったファイル data1.txt を開く2. data1.txt から x と y を読み取ってディスプレイ

に表示する( p.136, および例 14.4.3 参照) x と y は double 型の配列とする プログラム例 14.2.1 を参考に 21 組なのでループが必要 簡単なのは for 文 デキる人はプログラム例 14.4.3 を参考に while 文で

Page 24: 第 14 章 ファイル操作

#include <stdio.h>#define N 21int main(void){ double x[N], y[N]; int i; FILE *fp; fp=fopen("data1.txt", "r"); for (i = 0; i < N; i++) {

} fclose(fp); return 0;}

ファイルからデータを読み込む文 ディスプレイに表示する文

スキルアップタイム 1 のヒント 1

Page 25: 第 14 章 ファイル操作

#include <stdio.h>#define N 101int main(void){ double x[N], y[N]; int i; FILE *fp; fp=fopen("data1.txt", "r"); i = 0; while ( ) {

i++; } fclose(fp); return 0;}

ディスプレイに表示する文

スキルアップタイム 1 のヒント 2

ファイルからデータを読み込み、

EOF でないかをチェックする式

Page 26: 第 14 章 ファイル操作

スキルアップタイム 2 (レポート課題)スキアップタイム1 で作成したプログラムに以下の機能を追加し、進化させる( q14_s2.c )1. プログラム中で z = x3 75x を計算する

z は double 型の配列とする2. x, y, z を新しいファイル data2.csv に書き込む

データの間はコンマで区切る

データの間をコンマで区切り、ファイルの識別子を csv にしておくと、ダブルクリックにより Excel で開くことができる

Page 27: 第 14 章 ファイル操作

#include <stdio.h>#define N 21

int main(void){ double x[N], y[N], z[N]; int i; FILE *ifp, *ofp; ifp=fopen("data1.txt", "r"); ofp=fopen("data2.csv", "w"); for (i = 0; i < N; i++) {

} fclose(ifp); fclose(ofp); return 0;}

ファイルからデータを読み込む文

ディスプレイに表示する文 z[i] を計算する文 x[i],y[i],z[i] をファイル

に書き込む文

スキルアップタイム 2 のヒント 1

Page 28: 第 14 章 ファイル操作

ファイルからデータを読み込み、 EOF でないかをチェックする式

ディスプレイに表示する文 z[i] を計算する文 x[i],y[i],z[i] をファイ

ルに書き込む文

#include <stdio.h>#define N 101

int main(void){ double x[N], y[N], z[N]; int i; FILE *ifp, *ofp; ifp=fopen("data1.txt", "r"); ofp=fopen("data2.csv", "w"); i = 0; while (           ) {

i++; } fclose(ifp); fclose(ofp); return 0;}

スキルアップタイム 2 のヒント 2

Page 29: 第 14 章 ファイル操作

1. データファイル data2.csv を Excel で開く(ダブルクリックで OK )

2. 横軸 x 、縦軸を y

( および z ) とし、   y = 2x2 + 3

  z = x3 75x

のグラフを作成する3. data2.xls に保存する

スキルアップタイム 3 (レポート課題)

散布図を用いること

Page 30: 第 14 章 ファイル操作

スキルアップタイム 3 までできた人は、演習問題 14.5 からできるところまで .

スキルアップタイム 4

Page 31: 第 14 章 ファイル操作

レポートのファイルは保存しておくこと

課題:本日のスキルアップタイム 1 と 2 と 3

提出期限: 2011 年 1 月 21 日 12:50

提出場所:ネットワーク実験室( 1 )の入口近くの箱今回のレポートでは以下の項目をいれること .

表紙は不要• 学籍番号、氏名• 問題番号• ソースリスト• 実行結果とグラフ• 感想(5行以上書く)

プログラミング入門 II第 3 回レポート(必須)

Page 32: 第 14 章 ファイル操作

本日のパズル次のプログラムは何を出力するか#include <stdio.h>int i=0;void workover(int i){

i = (i%i) * ((i*i)/(2*i) + 4);printf("%d\n",i);

}int reset(int i){

if (i <= 2) i = 5; else i = 0;return i;

}main(){

int i=5;reset( i/2 ); printf("%d\n",i);reset( i=i/2 ); printf("%d\n",i);i = reset( i/2 ); printf("%d\n",i);workover(i);printf("%d\n",i);

}

12345