プログラミング基礎 II

第十一回: ファイル処理

Martin J. Dürst

duerst@it.aoyama.ac.jp

O 棟 529号室

テュールスト マーティン ヤコブ

http://www.sw.it.aoyama.ac.jp/2005/Programming%20Basics%20II/lecture11.html

AGU

© 2005 Martin J. Dürst 青山学院大学

先週の演習題

  1. 一行の文字列 (最大 80文字) を入力し (fgets 使用)、その文字列の大文字を全部小文字にするプログラムを作って下さい(ヒント: 教科書 p. 156 参照)。大文字から小文字への変換を関数にして下さい。
  2. 複数の数 (例えば 10個) を入力し、その最大、最少、そして平均を計算するプログラムを作って下さい。
  3. 複数 (例えば 10個) の整数を入力し、その数二つ同士の足算、掛算、余り、最大公約数、最小公倍数等の表を出力するプログラムを作って下さい。(ヒント: ab の最小公倍数 lcm(a, b) は a × b / gcd(a, b)) 正解の例: table.c (単純なやりかた)、table2.c (関数を引数として関数に渡すことによる高度なやりかた)
  4. 複数の数を入力し、その数を小さい順に出力するプログラムを作って下さい。
  5. 十個ほどの商品の名前と値段の分かる店があって、選択に応じて商品リスト、ある商品の注文、今までの注文のリスト、そして注文のまとめ (合計と消費税の計算など) ができるプログラムを作って下さい。

第 3 問のプログラムを来週 (12月19日月曜日) の授業前に提出して下さい。出力は提出しなくて結構。プログラムの印刷は等幅の書体 (Courrier 等) を使って下さい。字下げ、コメントなどを忘れないように。

関数に渡すことは簡単にはできない。

期末試験

日付
2006年 1月23日 (月曜日)
時間
13:10-14:10 (60分間)

ファイル入出力

今までの入出力の問題点:

問題点の解決方法:

  1. プログラムを変更しないで入出力をファイルから・ファイルへ行う (標準入出力のリダイレクト)
  2. ファイル名を指定しての入出力

リダイレクト

リダイレクトの指定

コマンドラインで指定する

プログラム名が「 test」、入力ファイルが 「input.txt」、出力ファイルが 「output.txt」 の場合

出力の場合には上書きに要注意!

ファイルの名前の指定

ファイルを開く: fopen

FILE *infile, *outfile; /* ファイルの変数を用意 */

infile  = fopen ("input.txt",  "r");
outfile = fopen ("output.txt", "w");

説明:

名前指定のファイルとの入出力

普段使う関数と似た関数を使う:

入力の例:

/* ファイル infile から整数変数 count に整数を読み込む */

fscanf (infile, "%d", &count);

出力の例:

/* ファイル outfile へ整数変数 count の値を出力する */

fprintf (outfile, "%d", count);

それそれの関数の引数の順番などは参考書やマニュアルページ (cygwin で例えば man fgets) もしくはウェブでみられる

読み込みのファイルの修了

書き出すときには (ハードディスクなどに空きがある限り) いくらでも書き出せるが、読み込みのファイルはいつか終わる。

これを EOF (end of file) と呼ぶ。入力の関数にはそれぞれ EOF を伝える機能があるが、関数によって違う。

例: scanffscanf は EOF になると「EOF」を返す。

プログラム (の一部) の例:

int result = 0, in;

while (result != EOF) {
    result = scanf ("%d", &in);
    /* 入力の処理 */
}

今週の演習題

  1. 今までの作ったプログラムから一つ選んで、キーボードと画面の入出力の代わりにリダイレクトを試してみて下さい。
  2. 今までの演習題で一回の計算があったところを、繰り返しを使って複数の入力を使うようにする。その入力をファイルで用意し、リダイレクトで操作して下さい。
  3. 複数のファイルからの入力が必要なプログラムを作って下さい。
    例: 今日までの提出宿題で縦の数と横の数を別にして、別のファイルから読み込んで下さい。

次回のための準備