簡體   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