Я пытаюсь прочитать заголовок изображения растрового изображения (.bmp) в файле struct
в c.fread в struct неправильно считывает данные
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef struct _BITMAPFILEHEADER {
WORD Type;
DWORD Size;
WORD Reserved1;
WORD Reserved2;
DWORD OffBits;
} BITMAPFILEHEADER;
Мой код для чтения файла растрового
FILE *fp;
BITMAPFILEHEADER header;
fp = fopen(file,"rb");
if (fp == NULL) {
printf("cannot open file!\n");
return 1;
}
fread(&header, sizeof(BITMAPFILEHEADER), 1, fp);
printf("Type: %02x\n", header.Type);
printf("Size: %04x\n", header.Size);
printf("Reserved: %02x\n", header.Reserved1);
printf("Reserved: %02x\n", header.Reserved2);
printf("Offset: %04x\n", header.OffBits);
Что все должно равняться:
Тип: 0x424d
Размер: 0x00060436
Reserved1: 0x00
Reserved2: 0x00
Смещение: 0x00000436
Что на самом деле happning (выход PRINTF):
Тип: 0x424d
Размер: 0x0006
Зарезервировано: 0x002
Зарезервировано: 0x436
Offset: 0x280000
(мой os - 32-разрядный ubuntu, если это помогает)
Если вам нужны фиксированные целые числа, используйте те, которые предусмотрены стандартом. Не используйте доморощенные типы. Также читайте abolut 'struct' layout и как правильно (de) сериализовать/marshall поток октетов. – Olaf
http://c-faq.com/struct/io.html, http://c-faq.com/struct/padding.html – melpomene
Как были записаны данные в файл? Вам нужно подражать тому, как это было написано при чтении данных.Если структура имеет дополнение (это почти наверняка делает), но данные были написаны по частям (как будто не было прокладки - это почти наверняка было), тогда данные не могут быть прочитаны, как вы это сделали. Вам нужно будет прочитать каждый элемент в свою очередь в отдельной операции 'fread()', и вы должны проверить, что каждый 'fread()' будет успешным, прежде чем использовать то, что, по вашему мнению, он вернул. –