读书人

想问一下子为什么0~1字节读到bitype

发布时间: 2013-04-05 10:24:33 作者: rapoo

想问一下,为什么0~1字节读到bitype中bisize总是读第3~4字节的内容啊
#include<stdio.h>
#include<stdlib.h>
int readbm(const char *bm);
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffbits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
BITMAPFILEHEADER bmp_file_header;
BITMAPINFOHEADER bmp_info_header;
RGBQUAD bmp_color_table;
int main()
{

char strname[]="c:\\1.bmp";
if(readbm(strname))
{
printf("\tfile_header\t\n\t\t{\n\
\tbfType=%d\n\
\tbfSize=%d\n\
\tbfReserved1=%d\n\
\tbfReserved2=%d\n\
\tbfOffbits=%d\n\
\t}\n\
information_header\n\t\t{\n\
\tbiSize=%d\n\
\tbiWidth=%d\n\
\tbiHeight=%d\n\
\tbiPlanes=%d\n\
\tbiBitCount=%d\n\
\tbiCompression=%d\n\
\tbiSizeImage=%d\n\
\tbiXPelsPerMeter=%d\n\
\tbiYPelsPelMeter=%d\n\
\tbiClrUsed=%d\n\
\tbiClrImportant=%d\n\
\t}\n\
color_table\n\t\t{\n\
\trgbBlue=%d\n\
\trgbGree=%d\n\
\trgbRed=%d\n\
\trgbReseved=%d\n\
\t}\n"\
,bmp_file_header.bfType\
,bmp_file_header.bfSize\
,bmp_file_header.bfReserved1\
,bmp_file_header.bfReserved2\
,bmp_file_header.bfOffbits\
,bmp_info_header.biSize\
,bmp_info_header.biWidth\
,bmp_info_header.biHeight\
,bmp_info_header.biPlanes\
,bmp_info_header.biBitCount\
,bmp_info_header.biCompression\
,bmp_info_header.biSizeImage\
,bmp_info_header.biXPelsPerMeter\
,bmp_info_header.biYPelsPerMeter\
,bmp_info_header.biClrUsed\
,bmp_info_header.biClrImportant\
,bmp_color_table.rgbBlue\


,bmp_color_table.rgbGreen\
,bmp_color_table.rgbRed\
,bmp_color_table.rgbReserved\
);



}
else printf("error");
}
int readbm(const char *bm)
{
FILE *fp;
if (NULL==(fp=fopen(bm,"rb")))
{printf("error");

return 0;
}
fread(&bmp_file_header,sizeof(BITMAPFILEHEADER),1,fp);
fread(&bmp_info_header,sizeof(BITMAPINFOHEADER),1,fp);
fread(&bmp_color_table,sizeof(RGBQUAD),1,fp);
fclose(fp);
return 1;
}

[解决办法]
// 这里是因为C中对结构体的内存对齐,所以要减去2,否则得不到正确的结果
fread(&bmpFile, sizeof(BMPFILEHEADER)-2, 1, file);

读书人网 >C语言

热点推荐