Фред пропускает чтение символов в объект - PullRequest
0 голосов
/ 11 января 2010

Я пытаюсь прочитать растровое изображение, начинающееся с его заголовка, но 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' (hex), первые две считанные переменные, похоже, пропускают 'F25A'

wFileType = 0x4d42 dwFileSize = 0x0000000d

Есть идеи, что случилось?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 января 2010

На мой взгляд, крайне неразумно использовать структуру таким образом. Да, в этом случае вы можете получить то, что хотите, с помощью специфической для компилятора прагмы. Я бы посчитал это приемлемым решением, если бы вы писали драйвер устройства Windows или что-то еще, что уже было очень специфично для конкретной платформы.

Но это загрузка файла в стандартном формате. Это код, который может работать в любой среде.

Лично я написал бы код, который поднимал данные из символьного массива и помещал их в структуру вручную вместо того, чтобы полагаться на структуру, которая будет правильно размещена компилятором так, что fread будет магическим все маленькие кусочки данных в нужных местах.

1 голос
/ 11 января 2010

Ваша структура выравнивается компилятором.

Кажется, вы используете Visual C ++. Добавьте эту строку перед вашим struct определением:

#pragma pack(push 1)

И эта строка после определения

#pragma pack(pop)

Чтобы узнать больше, см. Почему sizeof для структуры не равен сумме sizeof каждого члена?

0 голосов
/ 11 января 2010

Вы открываете файл в двоичном режиме? Если нет, то это ваша проблема, поскольку он преобразует '0D' в 424DF25A0D в некоторые другие данные, поскольку он интерпретирует его как символ возврата каретки / перевода строки, а не просто необработанные двоичные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...