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