2012/05/31

C言語 バイナリファイル読込み fread

音声ファイルのwavファイルを用意して、それを読み込んで、16進数で表示させてみる。wavファイルは波形編集ソフトのAudacityで作成した。実験なので5サンプルしかない短いもの。 これをStirlingというバイナリエディタで表示させると以下のようになる。ほとんどはヘッダ情報で、ファイルの各種情報が収められている。音の情報は20行の0Cから。16bitモノラルwavなので、ひとつの音は2バイトで構成されている。扱いはリトルエンディアン。 Cのプログラムで同じように表示させてみる。下の例では「wav_sample.wav」という名前のファイルをプログラムと同じ階層に置いている。

wavファイル読込プログラム

#include <stdio.h>
#include <stdlib.h>
int main(void){
  FILE *fp;
  int i;
  unsigned char buf[1000];/* 符号なしchar宣言 */
  int size;
  fp = fopen("wav_sample.wav", "rb"); /* rb バイナリ読込み */
  if (fp == NULL) { /* ファイルがない場合のエラー処理 */
        printf("error");
        exit(EXIT_FAILURE);
  }else{
        /* 読込み及びデータ数の取得 */
        size = fread(buf, sizeof(unsigned char), 1000, fp);
        for(i=0; i<size; i++){ /* 表示 */
           if(i % 16 == 0) printf("\n"); /* 改行 */
           printf("%02x ", buf[i]); /* 16進数で表示 */
         }
  }
  fclose(fp);/* ファイルを閉じる */
  return 0;
}
fread()でバイナリファイルを読み込んでいる。その中身は以下のようになっている。
buf この配列にデータを読み込む
sizeof 1つのデータサイズ sizeof(unsigned char)
1000 読込みデータの数。多めにしている。
fp 読み込むファイル FILEポインタ
fread()は読み込んだ後に、データの数を返す。それをそのままsizeに代入している。この例では54となる。表示のfor文では54回繰り返している。
52 49 46 46 2e 00 00 00 57 41 56 45 66 6d 74 20 
10 00 00 00 01 00 01 00 44 ac 00 00 88 58 01 00 
02 00 10 00 64 61 74 61 0a 00 00 00 00 00 ff 7f 
00 00 00 80 00 00 


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら