[英]Fread skipping characters reading into object
我正在尝试从其标题开始读取位图,但是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与二进制文件。
#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
知道会发生什么吗?
提前致谢。
您的结构正由编译器对齐。
您似乎正在使用Visual C ++。 在您的struct
定义之前添加以下行:
#pragma pack(push 1)
而这行定义之后
#pragma pack(pop)
要了解更多信息,请参阅为什么结构的sizeof不等于每个成员的sizeof之和?
我认为以这种方式使用结构是非常不明智的。 是的,在这种情况下,您可以使用编译器特定的编译指示来获得所需的内容。 如果您正在编写Windows设备驱动程序或已经非常特定于特定平台的其他东西,我会认为这是一个可接受的解决方案。
但这正在以标准格式加载文件。 它的代码可以在任何环境中运行。
就我个人而言,我将编写将数据从字符数组中取出并手工放入结构中的代码,而不是依靠编译器以正确的方式对结构进行布局,从而使fread神奇地投入所有工作数据放在正确的位置。
您是否以二进制模式打开文件? 如果不是,那么这就是您的问题,因为它将424DF25A0D中的“ 0D”转换为其他数据,因为它将其解释为回车符/换行符,而不仅仅是原始二进制数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.