ビットマップ(.bmp)イメージヘッダーをcのstruct
に読み込もうとしています。freadが構造体にデータを正しく読み込みません。
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef struct _BITMAPFILEHEADER {
WORD Type;
DWORD Size;
WORD Reserved1;
WORD Reserved2;
DWORD OffBits;
} BITMAPFILEHEADER;
ビットマップファイルを読み込むための私のコード
FILE *fp;
BITMAPFILEHEADER header;
fp = fopen(file,"rb");
if (fp == NULL) {
printf("cannot open file!\n");
return 1;
}
fread(&header, sizeof(BITMAPFILEHEADER), 1, fp);
printf("Type: %02x\n", header.Type);
printf("Size: %04x\n", header.Size);
printf("Reserved: %02x\n", header.Reserved1);
printf("Reserved: %02x\n", header.Reserved2);
printf("Offset: %04x\n", header.OffBits);
は何をすべて等しくなければならない:
タイプ:0x424d
サイズ:0x00060436
Reserved1:0x00
Reserved2を:0x00
オフセット:
タイプ:0x424d
サイズ:0x0006
予約:0x002
は予約:実際には(printfの出力を)happningは何0x00000436
0x436
オフセット:0x280000
を(私のOSは32ビットのubuntuであれば役に立ちます)
固定幅の整数が必要な場合は、標準で提供されているものを使用してください。自家製のタイプは使用しないでください。また、abolutの 'struct'レイアウトと、オクテットストリームを正しく直列化/マーシャルする方法を読んでください。 – Olaf
http://c-faq.com/struct/io.html、http://c-faq.com/struct/padding.html – melpomene
データはどのようにファイルに書き込まれましたか?あなたは、データを読むときに書かれた方法を模倣する必要があります。構造体にパディングがある場合(ほとんどの場合はそうですが)、データが断片的に書かれている場合(パディングがない場合とほぼ同じです)、データを読み込むことはできません。別の 'fread()'操作で各要素を順番に読み込む必要があります。そして、 'fread()'が返ってきたと思うものを使う前に、各fread()が成功していることを確認する必要があります。 –