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を使用する