PDA

Visualizza la versione completa : [C] Problema lettura da file


menphisx
28-04-2008, 08:57
Ho un certo codice che legge l'intestazione di un file bitmap e stampa le informazioni a schermo.
Il problema che se leggo i campi della struttura uno ad uno funziona:


/*1 caso: Funziona*/
fread(&bmp->header.type, sizeof(short), 1, bmp_file);
fread(&bmp->header.size, sizeof(int), 1, bmp_file);
fread(&bmp->header.reserved1, sizeof(short), 1, bmp_file);
fread(&bmp->header.reserved2, sizeof(short), 1, bmp_file);
fread(&bmp->header.offset, sizeof(int), 1, bmp_file);

fread(&bmp->infoHeader.InfoHeader_size, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.width, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.height, sizeof(nt), 1, bmp_file);
fread(&bmp->infoHeader.bitPlanes, sizeof(short), 1, bmp_file);
fread(&bmp->infoHeader.bitCount, sizeof(short), 1, bmp_file);
fread(&bmp->infoHeader.compressionType, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.ImageData_size, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.hPixelPerMeter, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.vPixelPerMeter, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.numberOfColors, sizeof(int), 1, bmp_file);
fread(&bmp->infoHeader.numberOfImportantColors, sizeof(int), 1, bmp_file);

se invece leggo tutto con una fread, mi sballa i valori:


/*2 caso: Non funziona*/
fread(&bmp->header, sizeof(BMP_Header), 1, bmp_file);
fread(&bmp->infoHeader, sizeof(BMP_InfoHeader), 1, bmp_file);

Le strutture sono dichiarate come:


typedef struct{

short type;
int size;
short reserved1;
short reserved2;
int offset;

}BMP_Header;

typedef struct {

int InfoHeader_size;
int width;
int height;
short bitPlanes;
short bitCount;
int ImageData_size;
int compressionType;
int hPixelPerMeter;
int vPixelPerMeter;
int numberOfColors;
int numberOfImportantColors;

}BMP_InfoHeader;

typedef struct {

BMP_Header header;
BMP_InfoHeader infoHeader;

}BMP;


L'output nel primo caso (funzionante) :


TotalSize: 60
Size: 16
FileSize: 332374
Type: 19778
Reserved Bytes: 0 0
Offset: 54
------------BMP_InfoHeader----------
Size: 40
Info Header Size: 40
Width: 330
Height: 335
BitPlanes: 1
BitCount: 24
Compression Type: 0
Size of Image Data: 332320
Horizontal Pixel Per Meter: 12008
Vertical Pixel Per Meter: 12008
Number Of Used Colors: 0
Number Of Important Used Colors: 0


che corretto.
Nel secondo caso (non funzionante); :


TotalSize: 56
Size: 16
FileSize: 5
Type: 19778
Reserved Bytes: 0 54
Offset: 0
------------BMP_InfoHeader----------
Size: 40
Info Header Size: 21626880
Width: 21954560
Height: 65536
BitPlanes: 24
BitCount: 0
Compression Type: 786956293
Size of Image Data: 304087040
Horizontal Pixel Per Meter: 786956288
Vertical Pixel Per Meter: 0
Number Of Used Colors: 0
Number Of Important Used Colors: 826146816


Perch ? :(

oregon
28-04-2008, 09:14
E' un problema di allineamento delle strutture in memoria (per default molti compilatori allineano a 32 bit, quindi 4 byte) e dato che la prima struttura e' di 14 byte, ne aggiungono 2 dummy per renderla di 16 byte ...

Puoi forzare tu l'allineamento indicando che venga fatto a 2 o 1 byte (va bene comunque nel tuo caso) con la direttiva

#pragma pack (2)

oppure

#pragma pack (1)

se prevista dal tuo compilatore o con un apposito switch (sempre dipendente dal compilatore) ...

menphisx
28-04-2008, 09:33
Ho risolto, per fortuna gcc supporta # pragma pack.
Questo problema mi veramente nuovo -.-

Grazie :smack:

:ciauz:

oregon
28-04-2008, 09:41
Originariamente inviato da menphisx
Questo problema mi veramente nuovo -.-

C'e' sempre qualcosa di nuovo ...



Grazie

Di nulla ... :ciauz:

Loading