2週目:バイナリファイルの操作[全体PDF]

今週の目標

ユーザが指定した画像ファイルを読み込み,そのコピーを別ファイルとして出力する


図1 2週目の目標

バイナリファイル[PDF]


図2 テキストエディタで開いたPPMファイルの例

一般的には,ASCIIコード表で文字に変換できる数値(0x00から0x7F,つまり符号なし整数だと0から127)のみが 含まれたファイルはテキストファイルと呼ばれ,テキストエディタで開くと文字列が表示される. 一方,テキストとして表示する用途が想定されていない,ASCIIコード表以外の数値も持つファイルはバイナリファイルと呼ばれる. PPM画像ファイル(P6)は,ヘッダ情報はテキスト形式であるが,画素値はバイナリ形式で保存されるため, バイナリファイルの一種である. 図2にPPMファイルを無理やりテキストエディタで開いた例を示す. ヘッダ部分は意味を成す文字列として表示されるが,画素値の部分はメモリ上に1バイトずつ 画素値の値が記録されているだけで,テキストによる表示は想定されていない. よって,PPMファイルをテキストエディタで開くと,画素値の部分は意味を成す文字列にはならない. つまり,バイナリデータ(本課題ではPPMファイルの画素値)をファイルに読み書きする際は, テキストデータのための関数(fgets,fscanf,fprintfなど)が使えないことになる.

バイナリファイルの読み書き

fread関数,fwrite関数[PDF]

size_t fread(void *buffer, size_t size, size_t count, FILE *fp);

書式なしデータをストリームから読み出す関数.fp から size バイトの項目を count 数まで読み出し,buffer に格納する.戻り値は,実際に読み出した全項目の数.

size_t fwrite(const void *buffer, size_t size, size_t count, FILE *fp);

書式なしデータをストリームへ書き込む関数.size バイトの項目を count 数だけ buffer から,fp へ書き込む.戻り値は,実際に書き込んだ項目数.


図3 fread関数の使用例


図4 fwrite関数の使用例

バイナリデータ(書式なしデータ)をファイルに読み書きする関数として,freadとfwriteがある. 使用例を図3, 4に示す. いずれもバイナリファイルをオープンするため,fopenの第二引数に"b"を追加する必要がある. ファイルを開いた後,読み込みではfreadを使用し,ファイルからsizeof(char)(=1バイト)のデータを100個読み込み, bufferに格納している.また,書き込みではfwriteを使用し,bufferの1バイト×100個の要素をファイルに出力している.

演習課題4_2_1[PDF]

PPMファイルから画素値を読み込む処理をiioLoadFile関数に実装せよ. 格納先はIMAGE構造体の1次元静的配列であるpBufferとする. さらに,PPMファイルにpBufferの画素値を書き出す処理をiioSaveFile関数に実装せよ. 実装後,入力画像と同じ画像が出力されるか確認すること.以下は注意点である.

  • iioLoadFileとiioSaveFileの両方の実装
  • iioSaveFileのファイルopenはwbモードにすること
  • ipCopyにおける画素値のコピーの実装
  • 実行時,出力ファイル名は.txtではなく.ppmにすること