проблема записи растрового файла заголовка в 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 байтов (размер stuct), и значения должны быть

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 поврежден.

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

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

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

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

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