プログラミング演習Ⅱ 第1回 ガイダンス

プログラミング演習Ⅱ
第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へ直接質問しに来ても構いません