C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

バイナリデータを出力する

2012.08.10

fwrite関数は、ファイルにレコード単位に出力します。主に、バイナリデータを出力するために使用します。

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

*ptrは出力するデータが格納されている領域を指定します。
sizeはレコード長をバイト単位で指定します。
nmembは出力するレコードの個数を指定します。
*streamはfopen関数で取得した、ファイルポインタを指定します。

戻り値として、出力したレコードの個数を返します。EOF又は、エラーの場合は、指定した個数より小さな値(又は0)を返します。

次の例題プログラムは番号、身長、体重、肥満度(BMI)をbmi.datファイル(固定長バイナリレコード形式)に出力します。

プログラム 例

#include <stdio.h>

int main()
{
  struct bmi_type {
    int     number;         /* 番号 */
    double  weight;         /* 体重 */
    double  height;         /* 身長 */
    double  bmi;            /* 肥満度 */
  } bmi_rec;                /* 肥満度データ */

  FILE     *fp;
  int      no;
  int      return_code = 0;

  if ((fp = fopen('bmi.dat', 'w')) != NULL) {
    no = 0;
    while (1) {
      printf('%03d番目の入力\n', ++no);
      bmi_rec.number = no;
      printf('\t体重(Kg)を入力してください ==> ');
      scanf('%lf', &bmi_rec.weight);
      if (bmi_rec.weight == 0.0) {
        break;
      }
      printf('\t身長(Cm)を入力してください ==> ');
      scanf('%lf', &bmi_rec.height);

     /* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
      bmi_rec.bmi =
        bmi_rec.weight / (bmi_rec.height / 100.0) / (bmi_rec.height / 100.0);

      /* ファイルに出力 */
      fwrite(&bmi_rec, sizeof(bmi_rec), 1, fp);
    }

    fclose(fp);
  }
  else {
    printf('ファイルのオープンに失敗しました\n');
    return_code = 1;
  }

  return return_code;
}

例の実行結果

$ ./fwrite.exe
$001番目の入力
        体重(Kg)を入力してください ==> 67.5
        身長(Cm)を入力してください ==> 175.5
002番目の入力
        体重(Kg)を入力してください ==> 88
        身長(Cm)を入力してください ==> 187.8
003番目の入力
        体重(Kg)を入力してください ==> 54.3
        身長(Cm)を入力してください ==> 164
004番目の入力
        体重(Kg)を入力してください ==> 0
$
$ od -x --width=28 bmi.dat
0000000 0001 0000 0000 0000 e000 4050 0000 0000 f000 4065 4af4 1518 ea58 4035
0000034 0002 0000 0000 0000 0000 4056 999a 9999 7999 4067 44e2 10a7 f382 4038
0000070 0003 0000 6666 6666 2666 404b 0000 0000 8000 4064 6a4c 27e6 305a 4034
0000124
$

関連記事