第 14 章 ファイル操作

Post on 03-Jan-2016

27 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

第 14 章 ファイル操作

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

14.0  はじめに

結果は画面に表示

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

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

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

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

3 8

和は 11

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

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

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

14.0  はじめに

結果は別のファイルに

保存

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

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

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

fclose(fp);

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

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

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

fclose(fp);

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

#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  ファイルへの書き込み

#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 にしておくとダブルクリックによりメモ帳で開くことができる

#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 と同じ

#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 ができていることを確認する

#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 のフォルダにコピーしておく

#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 のフォルダにコピーしておく

#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 のフォルダにコピーしておく

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 の追加内容を確認

#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 を入力

#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 )

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

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

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;}

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 が指すファイルの終端でない)間は、 {…} を繰り返す。

#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 ができていることを確認する

興味のある人は 第 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  ファイルの構造

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

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

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

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

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

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 (レポートの準備)

                                           

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;}

スキルアップタイム 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 文で

#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

#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 でないかをチェックする式

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

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

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

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

#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

ファイルからデータを読み込み、 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

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

2. 横軸 x 、縦軸を y

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

  z = x3 75x

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

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

散布図を用いること

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

スキルアップタイム 4

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

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

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

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

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

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

本日のパズル次のプログラムは何を出力するか#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

top related