Problem set 4 - fread/fwrite

  • fread(&bf, size, number, inptr): 1つ目の引数は、読み込んだデータを格納する場所(readで読んだものを一時的に格納するポインタ)。

readを行うと、&bfの中にデータが格納される
格納されたあとは、.なんとかでデータのさらに細かい部分にアクセスできる
readはまずファイルの先頭から読みこみ、読み込んだ後勝手にposition indicatorをずらす。すなわち、freadを2回目に呼ぶと、1回目の続きから読み出される(freadを呼ぶ度にファイルの先頭が更新される)...しかも、単純に呼び出した場合のみならず、代入・条件として使用してもずれるのは要注意!

  • 読み込む量が2, 3引数目の掛け算のバイト数

bfはローカル変数なので、宣言することで28byte分の領域をスタック(メモリ上のどこかで)に確保できる

  • heap: mallocで確保した領域が住んでいる場所

stack: function local 変数が居る場所
data: global 変数が居る場所 最も基本的

  • fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

readで格納したbfそのままの中身を使いたいから、このようにfwriteを利用。
※&bf だけではなんかポインタが来たしかわからない。&bfから始めて何バイト読み込んでそれをファイルに書き込むか、2、3引数目で指定している。
書き込んだら書き込んだ分だけposition indicatiorが進むので、次はその続きから書き込まれる。

  • fwriteは書き込む元となるpointerが存在した上で使えるもの、

今回のpadding: 0x00のように定数値を書き込みたい場合はfputcを使用する