VC透过fwrite生成bmp文件无法打开

VC通过fwrite生成bmp文件无法打开
写了一个可以根据Data数组中的数据构造bmp的函数,结果bmp文件无法打开VC透过fwrite生成bmp文件无法打开
代码如下,W为图像宽度(像素单位),H为图像高度(像素宽度),string为存储路径,Data为数据数组。
代码如下:
CMyDib::CMyDib(int W, int H,LPCTSTR string,unsigned char *Data)
{
FILE   *fp;   
// bool   ret;   
UINT   nPad;   
BYTE   Pad[4];   
RGBQUAD   Quad[256];   
BITMAPFILEHEADER   bfh;   
BITMAPINFOHEADER   bih;   
    int count;
//设定BITMAPFILEHEADER   
memset(&bfh,  0,  sizeof(bfh));   
bfh.bfType   =  'BM';   
bfh.bfSize  = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 + ((W*8+31)/32*4)*H;   
bfh.bfOffBits   = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*256;   
    
//设定BITMAPINFOHEADER   
memset(&bih,   0,   sizeof(bih));   
bih.biSize   =   sizeof(bih);   
bih.biWidth   =   W;   
bih.biHeight   =   H;   
bih.biPlanes   =   1;   //必须为1   
bih.biBitCount   =   8;   
    bih.biCompression = BI_RGB;
bih.biSizeImage = ((W*8+31)/32*4)*H;

//设定调色盘数据Quad   
for(int   n=0;   n<256;   n++)  
{   
Quad[n].rgbBlue   =   n;   
Quad[n].rgbGreen   =   n;   
Quad[n].rgbRed   =   n;   
Quad[n].rgbReserved   =   0;   
}   

//下面写数据到BITMAP文件   
fp   =   fopen(string,   "wd");   
// if   (fp==NULL)   return   false;   
count = fwrite(&bfh,   1,   sizeof(bfh),   fp);   
count = fwrite(&bih,   1,   sizeof(bih),   fp);   
count = fwrite(Quad,   1,   sizeof(Quad),   fp);   
    
//下面写入数据部分,注意,bmp的数据上下是颠倒的   
Data   =   Data   +   W*(H-1);   //因为上下颠倒,所以需要将Data指向最后   
//一行,以后再对Data进行减操作。   
nPad   =   ((W*8+31)/32*4)   -   W;   //因为bmp每行的数据为4的倍数,所以   
//需要在每行后面补0,nPad为补的字节数   
memset(Pad,   0,   sizeof(Pad));   
for(int   h=H-1;   h>=0;   h--)  
{   
count = fwrite(Data,   1,   W,   fp);   
count = fwrite(Pad,   1,   nPad,   fp);   
Data   =   Data   -   W;   ////因为上下颠倒,Data是倒退着写入文件   
}   
// ret  =  ferror()==0;
fclose(fp);   
}
------解决方案--------------------
对比一下正确的文件跟写入的文件,估计还是写入的数据有问题
------解决方案--------------------
你用winhex,或者ultraedit打开看下,两个文件有没有什么不一样,就是一个图片,一个你写的文件