第 14 章 ファイル操作
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 PresentationTRANSCRIPT
![Page 1: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/1.jpg)
第 14 章 ファイル操作
14.1 ファイルへの書き込み14.2 ファイルからの読み込み14.3 ファイルへの追加書き込み14.4 ファイル名の指定14.5 複数のファイルの同時オープン14.6 ファイルの構造14.7 その他のファイル入出力関数
![Page 2: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/2.jpg)
14.0 はじめに
結果は画面に表示
データを入力してください。
いわば、その場限りの処理だった…
これまでのプログラミングの学習では、入力データは
プログラム中で設定 キーボードから入力
3 8
和は 11
![Page 3: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/3.jpg)
一般的なプログラミングでは、入力データは
Excel 等のアプリケーションで作成 画像や音声ファイル キーボードから入力
プログラム中でファイルの操作が必要
14.0 はじめに
結果は別のファイルに
保存
![Page 4: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/4.jpg)
ファイルへのデータの書き込みFILE *fp;
fp=fopen(" ファイル名 ", "w");
fprintf(fp, " 書式指定子 ", 書き込む変数 );
fclose(fp);
ファイルからのデータの読み込みFILE *fp;
fp=fopen(" ファイル名 ", "r");
fscanf(fp, " 書式指定子 ", & 読み込む変数 );
fclose(fp);
今日のポイン今日のポイントト
![Page 5: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/5.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/6.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/7.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/8.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/9.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/10.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/11.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/12.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/13.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/14.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/15.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/16.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/17.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/18.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/19.jpg)
興味のある人は 第 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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/20.jpg)
14.7 その他のファイル入出力関数 プログラム例 14.7.1 はファイル間のコピー ファイルコピーは OS上( Windows ならエ
クスプローラ)でファイルを複製するほうが実際的
主な入出力関数は p.185 に掲載 興味のある人は、いろいろ試してみよう
![Page 21: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/21.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/22.jpg)
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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/23.jpg)
スキルアップタイム 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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/24.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/25.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/26.jpg)
スキルアップタイム 2 (レポート課題)スキアップタイム1 で作成したプログラムに以下の機能を追加し、進化させる( q14_s2.c )1. プログラム中で z = x3 75x を計算する
z は double 型の配列とする2. x, y, z を新しいファイル data2.csv に書き込む
データの間はコンマで区切る
データの間をコンマで区切り、ファイルの識別子を csv にしておくと、ダブルクリックにより Excel で開くことができる
![Page 27: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/27.jpg)
#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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/28.jpg)
ファイルからデータを読み込み、 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 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/29.jpg)
1. データファイル data2.csv を Excel で開く(ダブルクリックで OK )
2. 横軸 x 、縦軸を y
( および z ) とし、 y = 2x2 + 3
z = x3 75x
のグラフを作成する3. data2.xls に保存する
スキルアップタイム 3 (レポート課題)
散布図を用いること
![Page 30: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/30.jpg)
スキルアップタイム 3 までできた人は、演習問題 14.5 からできるところまで .
スキルアップタイム 4
![Page 31: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/31.jpg)
レポートのファイルは保存しておくこと
課題:本日のスキルアップタイム 1 と 2 と 3
提出期限: 2011 年 1 月 21 日 12:50
提出場所:ネットワーク実験室( 1 )の入口近くの箱今回のレポートでは以下の項目をいれること .
表紙は不要• 学籍番号、氏名• 問題番号• ソースリスト• 実行結果とグラフ• 感想(5行以上書く)
プログラミング入門 II第 3 回レポート(必須)
![Page 32: 第 14 章 ファイル操作](https://reader036.vdocuments.pub/reader036/viewer/2022062309/56813602550346895d9d76c0/html5/thumbnails/32.jpg)
本日のパズル次のプログラムは何を出力するか#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