繁体   English   中英

恐惧跳过字符读入对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM