首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

想问一下子,为什么0~1字节读到bitype中bisize总是读第3~4字节的内容

2013-04-05 
想问一下,为什么0~1字节读到bitype中bisize总是读第3~4字节的内容啊#includestdio.h#includestdlib.hi

想问一下,为什么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); 

热点排行