第4回 ファイル操作(5月12日)

今日の課題

■ ファイル操作

標準入力と標準出力は、プログラムの実行時に特別な指定なしに使うことのできる情報の窓口である。ファイル操作は、新たに情報の窓口を作り、その窓口を使って情報の入出力をすることで実現する。

また、使い終わった窓口は閉じる。一般に、計算機システムが持つことのできる窓口の数に限度があるためである。

fopen

窓口を設置する関数は、fopenである。窓口は、読み込み(入力)用、および、書き込み(出力)用の大きく2種類がある。書き込みは、ファイルを新規に作成する場合と、既存のファイルに追加する場合の2つがある。

fopen の機能
記述 意味
r 読み込み
w 新規書き込み
a 追加書き込み

ファイルの窓口は、C言語ではファイルデスクリプタ(FILE *)というタイプの変数を使う。

fclose

窓口を閉じるには、fclose 関数を使う。引数にはファイルデスクリプタを与える。

使用例:
/* list0401.c */
#include <stdio.h>
main()
{
  FILE *fr, *fw;
  unsigned char buff[BUFSIZ];

  fr = fopen("list0401.c","r");
  fw = fopen("tmp1","w");

  fgets(buff, BUFSIZ, fr);
  fputs(buff, fw);

  fclose(fr);
  fclose(fw);
}

9行目の「w」を「a」に換えて実行すると、実行するたびにファイルの後に文字列が追加される。

8行目で fopen 関数の代りに、stdin を代入すると、標準入力の結果をファイル tmp1 に書き込むようになる。

■ 分割コンパイル(リンク)

C言語でのプログラム開発では、分割コンパイルという方法がよく用いられる。

分割コンパイルとは、ソースコードを複数のファイルに分けておき、各ファイルのコンパイルの結果を最後に統合して、1つの実行ファイルにする方法である。ソースをコンパイルした直後の結果は、オブジェクトファイル(拡張子が o)という。複数のオブジェクトファイルを統合することをリンクという。

画像表示のオブジェクトファイル

例題として、画像ファイルを扱ってみよう。

画像ファイルフォーマットの一つに、pgm がある。pgmファイルはグレイスケール(モノクロ)の画像を扱う。形式は最初の行に「P5 サイズ サイズ 色深度」の指定があり、次の行以降に 0 〜色深度までの値を並べる。

pgmimage.o は、pgmファイルを扱うための関数を予めコンパイルしたものである(gcc -c pgmimage.c、とする)。

⇒ pgmimage.o

ヘッダファイル

pgmimage.o のオブジェクトファイルで使用可能な関数は、ヘッダファイル pgmimage.h で一覧できる。

⇒ pgmimage.h

サンプルプログラムのコンパイルと実行方法

白黒を反転させるプログラム list0402.c について説明する。 ⇒ list0402.c

  1. pgmimage.opgmimage.himg01.pgm list0402.c を用意する。
  2. gcc -c list0402.c
  3. gcc list0402.o pgmimage.o
  4. ./a.out
  5. display tmp.pgm

画像表示コマンド「display img01.pgm」

⇒ 実行結果(1)

□ 課題1

画像の上下を反転させるプログラムを作成せよ。ただし、入力と出力のファイル名は自由に指定できるものとする。(prac0401.c)

実行例:
% ./a.out
入力ファイル名は?  img01.pgm
画像のサイズは 400 x 400 です。
出力ファイル名は?  tmp2.pgm
%

⇒ 実行結果(2)

ちなみに、list0402.c では、1次元の配列に画像を格納している。座標(i,j)は配列変数では i + j * sizex の位置になる。例えば、buff1[ i + j * sizex] とする。

□ 課題2

画像の偶数座標、たとえば、(0,0),(2,0),(4,0),…(0,2),(4,2),…、のみを取り出して、画像の縦と横の長さを半分にした画像を作るプログラムを作成せよ。(prac0402.c)

実行例:
% ./a.out
入力ファイル名は?  img01.pgm
画像のサイズは 400 x 400 です。
出力ファイル名は?  tmp3.pgm
%

⇒ 実行結果(3)

■ 宿題

課題1、および、課題2プログラムをプリントアウトし、各行にコメントを手書きする。コメント付きプログラムリストを提出せよ。

来週(5月19日)の授業開始時に集めます。


2004.5.9 by tokuhisa

`