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