проблема с записью заголовка растрового файла в C

Я пытаюсь создать новый файл растрового изображения, используя C. Это структура для заголовка файла .bmp.

#define uint16 unsigned short
#define uint32 unsigned long
#define uint8  unsigned char
typedef struct 
{
 uint16 magic;  //specifies the file type "BM" 0x424d
 uint32 bfSize;  //specifies the size in bytes of the bitmap file
 uint16 bfReserved1;  //reserved; must be 0
 uint16 bfReserved2;  //reserved; must be 0
 uint32 bOffBits;  
} BITMAPFILEHEADER;

В моей программе я делаю это.

main() {
FILE* fp;
fp = fopen("test.bmp", "wb");
 BITMAPFILEHEADER bmfh;
 BITMAPINFOHEADER bmih;

 bmfh.magic = 0x4d42; // "BM" magic word
 bmfh.bfSize = 70; 
 bmfh.bfReserved1 = 0;  
 bmfh.bfReserved2 = 0; 
 bmfh.bOffBits = 54; 
fwrite(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
fclose(fp);
}

Итак, когда я читаю свой файл test.bmp, он должен содержать 14 байт (размер структуры), а значения должны быть

42 4d 46 00 00 00 00 00 00 00 36 00 00 00

Но если я прочитаю файл, он покажет мне 16 байт:

42 4d 04 08 46 00 00 00 00 00 00 00 36 00 00 00

Откуда это "04 08"? Мой файл bmp становится поврежденным.

Мой вопрос заключается в том, что при вводе-выводе двоичного файла, если я пишу структуру в файл, и его размер не кратен 4 байтам (32 бита), он автоматически меняет структуру?

Любая идея, как обойти это?


person Punit Soni    schedule 09.09.2010    source источник


Ответы (1)


Ваша структура заполняется. 04 08 - это мусорное значение из вашего стека. Вам нужно использовать любую функцию, которую ваш компилятор предоставляет для упаковки структуры. В большинстве случаев вы сможете использовать #pragma pack(1):

#pragma pack(1)  // ensure structure is packed
typedef struct 
{
   .
   .
   .
} BITMAPFILEHEADER;
#pragma pack(0)  // restore normal structure packing rules

Вы можете прочитать об дополнении структуры данных в Википедии.

person Carl Norum    schedule 09.09.2010