Fread跳过字符读入对象

时间:2010-01-11 02:52:11

标签: c++ bitmap

我正在尝试从头部开始读取位图,但是fread正在为我跳过字符。

我在标题中使用了这个typedef:

#include <windows.h>  // Used for other
#include <cstdio>
typedef struct tagBITMAPHEADER{
    WORD    wFileType;      
    DWORD   dwFileSize;     
    WORD    dwReserved;     
    WORD    dwReserved2;        
    DWORD   dwBmpDataOffset;
    DWORD   dwBmpHeaderSize;
    DWORD   dwWidth;    
    DWORD   dwHeight;   
    WORD    wPlanes;    
    WORD    wBitsPerPixel;  
    DWORD   dwCompression;  
    DWORD   dwBitmapDataSz; 
    DWORD   dwHRes;     
    DWORD   dwVRes;     
    DWORD   dwColors;   
    DWORD   dwImpColors;    
} BITMAPHEADER, *PBITMAPHEADER;

在我的代码中,我只使用一个简单的fopen和fread with binary。

#include "ImageLoader.h"
BITMAPHEADER pbhFileInfo;
FILE *fBitmap = fopen(FileName,"rb"); //Open file in read / binary  
if (fBitmap) //File is now open
{   fread(&pbhFileInfo,sizeof(BITMAPFILEHEADER),1,fBitmap);
    fclose(fBitmap);
}

虽然我的位图以'424DF25A0D'(十六进制)开头,但读入的前两个变量似乎跳过'F25A'

wFileType = 0x4d42 dwFileSize = 0x0000000d

知道可能会发生什么事吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您的结构由编译器对齐。

您似乎正在使用Visual C ++。在struct定义之前添加此行:

#pragma pack(push 1)

定义后的这一行

#pragma pack(pop)

要了解详情,请参阅Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

答案 1 :(得分:1)

在我看来,以这种方式使用结构是非常不明智的。是的,在这种情况下,您可以使用编译器特定的pragma获得所需的内容。如果您正在编写Windows设备驱动程序或其他已经非常特定于特定平台的内容,我会认为这是一个可接受的解决方案。

但这是以标准格式加载文件。它的代码可以在任何环境中运行。

就个人而言,我会编写一些代码,将数据从字符数组中提取出来,然后手工将其放入结构中,而不是依靠编译器以正确的方式布置结构,这样fread就会神奇地放入所有小数据都在正确的位置。

答案 2 :(得分:0)

您是否以二进制模式打开文件?如果没有,那么这就是你的问题,因为它会将424DF25A0D中的'0D'转换为其他数据,因为它将其解释为回车符/换行符,而不仅仅是原始二进制数据。