C言語 バイナリファイルの読み込み - stdio.h - [ fread ]

2008.09.21 Sunday | by LRESULT


イナリファイルの読み込みは、fread()関数を使います。

また、fopen()関数のオープンモードを、"r" から "rb" に変更する必要があります。

バイナリファイルを読み込む際に "r" のままだと、テキストファイルとして扱ってしまう為、
0x1A(EOF)文字があった場合にテキストファイルの終わりと判断してしまい、
最後まで読み込まれないという不具合が生じてしまいます。


fread
書式 size_t fread( void *buf, size_t size, size_t num, FILE *fp )
機能 バイナリファイルを読み込む
引数 void *buf : バイナリデータを受け取るバッファ
size_t size : データ要素1個のサイズ
size_t num : データの個数
FILE *fp : ファイル(ストリーム)ポインタ
戻り値 成功すると、読み込んだデータの個数を返し、
データが無いと、0を返します。





サンプルコード
10x10ドットのビットマップファイル「test.bmp」を
バイナリファイルとして読み込み、16進数のダンプ処理(表示)を行います。

ちなみに、ダンプとは、なんらかのデータファイルやテキストファイルを
生のデータとして解析するために目に見える形として表示や保存する事です。
設定したフラグがONかOFFかを見たりなど、ちょいちょい役に立ちます。
#include <stdio.h>

int main(void)
{
  FILE *fp;
  char *fname = "test.bmp";
  unsigned char buf[10000];
  int  i, size;

  fp = fopen( fname, "rb" );
  if( fp == NULL ){
    printf( "%sファイルが開けません¥n", fname );
    return -1;
  }

  size = fread( buf, sizeof( unsigned char ), 10000, fp );

  for( i=0; i<size; i++ ){
    if( i % 16 == 0 ) printf( "¥n" );
    printf( "%02X ", buf[i] );
  }

  fclose( fp );
  return 0;
}



結果
42 4D 76 ... と、続いて表示されているはずです。
これは、ビットマップファイルのヘッダの一部ですが、拡張子で判定しなくても
ダンプした結果を基に、ヘッダからビットマップファイルと判定できるわけです。

fopen()のモードを "rb" にするのを忘れないようにして下さい。
このサンプルでは、あらかじめ大きなバッファ(buf[10000]) を用意し、
fread()の戻り値からファイルサイズを取得してから、2桁の16進数表示を16列毎に行っています。

このサンプルで、バッファ10000を超えるファイルを読み込む場合は、
  途中で終わってしまいますので気をつけてください。

カテゴリ:C言語 stdio.h | 22:42 | comments(0) | trackbacks(0) | -


コメントする











この記事のトラックバックURL

http://simd.jugem.jp/trackback/50

トラックバック