情報・知能工学系 山本一公 kyama@tut.jp プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公 kyama@tut.jp
今日の内容 教科書 p.289~ ファイルとストリーム テキストとバイナリ 今日は使い方だけ教えます fopen, fclose, fscanf, fprintf 標準入出力 テキストとバイナリ fread, fwrite 今日は使い方だけ教えます 考えるだけの知識はまだないので、 深く考えないこと
ファイル プログラムを実行する! C言語の「ソースファイル」 結果はどこに? 画面に表示させる! 保存する方法は? スクロールすると消えてしまう…… 保存する方法は? 「ファイル」に保存! C言語の「ソースファイル」 ハードディスク上に保存されている コンパイラはファイルを読み出して処理する 保存してある情報は読み出せる!ってこと
ファイルを開こう(1) ファイルを使えるようにするための操作 まずはFILE構造体へのポインタを宣言! ……何それ? 今は「おまじない」だと思ってください /* p.295 List 13-1 ファイルのオープンとクローズ */ #include <stdio.h> int main(void) { FILE *fp; ← おまじない! fpは変数名なので変えられる “*”を忘れないように!
ファイルを開こう(2) fopen関数でファイルを開く 引数はファイル名とモード “r”で読み込み、“w”で書き込み(p.293参照) ファイルのオープンとクローズ */ #include <stdio.h> int main(void) { FILE *fp; fp = fopen(“abc”, “r”); /* ファイルのオープン */ ↓「abc」という名前のファイルを読み込みモードで開く
ファイルを開こう(3) ファイルのオープンとクローズ */ #include <stdio.h> int main(void) { FILE *fp; fp = fopen(“abc”, “r”); /* ファイルのオープン */ if (fp == NULL) printf(“\aファイルをオープンできません。\n”); else { /* ファイルから読込みなどを行う */ ←オープンに失敗すると、fopenはNULLを返す
ファイルを閉じる 作業が終わったらファイルを閉じる fclose関数でファイルを閉じる 引数はFILE構造体へのポインタ if (fp == NULL) printf(“\aファイルをオープンできません。\n”); else { /* ファイルから読込みなどを行う */ fclose(fp); /* ファイルのクローズ */ } return (0);
入出力してみよう 今までと同じように入出力しよう! fscanf, fprintf 入出力先を指定する ファイル構造体へのポインタを使う! それ以外の書式はscanf, printfと同じ scanf(“%d”, &n); fscanf(fp,“%d”, &n); printf(“n = %d\n”, n); fprintf(fp,“n = %d\n”, n);
ストリーム ストリーム=流れ ファイルへの入出力はデータの流れ ファイルだけじゃなく、他の入出力も含めて、 全てがデータの流れ ファイルストリーム ファイルだけじゃなく、他の入出力も含めて、 全てがデータの流れ 標準ストリーム 標準入力・標準出力・標準エラー出力 stdin, stdout, stderr システムが用意している特殊なファイル構造体へのポインタ scanf(“%d”, &n) = fscanf(stdin,“%d”, &n); printf(“n = %d\n”, n) = fprintf(stdout,“n = %d\n”, n);
バイナリデータの読み書き(1) バイナリデータ テキストデータ データを保存するのには、コンピュータの内部表現をそのまま用いる方が効率が良い ビットの並びで表現されたデータ コンピュータの内部表現 テキストデータ 人間が読めるデータ ASCIIコードなど データを保存するのには、コンピュータの内部表現をそのまま用いる方が効率が良い 教科書 p.307, Fig.13-8
バイナリデータの読み書き(2) ファイルのオープンはバイナリモードですること! 閉じるのは同じ fp = fopen(“abc”, “rb”); fp = fopen(“def”, “wb”); fclose(fp);
バイナリデータの読み書き(3) ファイルからデータを読み込む:fread関数 ファイルにデータを書き出す:fwrite関数 第1引数は読み込んだデータを入れる変数(”&”を付けること!) 第2引数の”sizeof”にデータを入れる変数の型を与える 上の例では”int” 第3引数は配列を覚えるまでは”1”で固定 第2引数×第3引数[byte]のデータを読み込む ファイルにデータを書き出す:fwrite関数 引数の順序・書式はfreadと同じ 第1引数に入っているデータをバイナリ形式でファイルに書き出す int x; fread(&x, sizeof(int), 1, fp); float x; fwrite(&x, sizeof(float), 1, fp);
難しい? 構造体とポインタが絡む話なので、 正しく理解できるようになるのはまだ先 だから、教科書の最後の章にあるのだ! 今は、丸のみで覚えて、とりあえず 使えるようにだけなってください 配列を扱うようになると、 バイナリデータの読み書きが役に立つ!
今週の課題 整数値を3つキーボードから読み込んで、それをテキスト形式でファイルに書き出すプログラムを作成・実行せよ。1行に1つの数字を書き出すこと。書き出すファイル名は”kadai1-1.dat”とせよ。 課題1で作成したファイルから整数値を3つ読み込んで、それをバイナリ形式でファイルに書き出すプログラムを作成・実行せよ。書き出すファイル名は”kadai1-2.dat”とせよ。そして、データを書き出したファイルの内容を、教科書 p.310のList 13-10のプログラムを使って表示・確認せよ。
レポートについて 電子メールで提出 提出先は prog2@slp.cs.tut.ac.jp Subjectを「プログラミング演習2 課題1 学籍番号・氏名 」とすること C言語ソースファイルを添付する メールの本文には何も書かなくて良いです ソースファイルの頭にコメントで以下の情報を入れる 学籍番号・氏名 プログラムの説明(どのように動くのか、工夫した点等) 実行結果(長い場合は一部)を貼る 提出締切は、10月17日(水) 12:00 (1週間後)
授業用Webサイト URL: http://www.slp.cs.tut.ac.jp/~kyama/programming2/ 課題のpdfファイルが置いてあります。 授業で使ったpptファイルを置いていきます。 質問メールは、以下のどちらかのアドレスまで kyama@tut.jp prog2@slp.cs.tut.ac.jp C-515へ直接質問しに来ても構いません