Dziwny błąd

0

Mam mały problem z funkcją fread. Chce odczytać nagłówek z pliku binarnego i utworzyłem taki uchwyt:

 typedef struct handle{
  short int biType;          // 2 bajty 
  long int  fiSize;            // 4 bajty
}handle;

kiedy chce sprawdzić rozmiar nagłówka funkcją sizeof(handle) wyskakuje mi liczba 8 ?? Nie przejmując się tym napisałem odczyt : fread(&h, 6 ,1, plik)); h to zmienna utworzona w taki sposób: handle h; teraz kiedy sprawdzam dane to zgadza się tylko pierwsza zmienna biType!! Natomiast fiSize jest już zepsuta. Próbowałem zmienić uchwyt na taki:

typedef struct handle{
  short int biType;          // 2 bajty 
  short int  fiSize1;         // 2 bajty
  short int  fiSize2;         // 2 bajty
}handle;

I teraz odczytując miałem dobre wyniki tzn. rozmiar wyszedł 6 a wartości zmiennych się zgadzały.. tylko że ja chce mieć fiSize zamiast rozbicia go na dwie mniejsze części :(


0

No bo rozmiar tej struktury (wyzej) wynosi 8B. Tyle podal sizeof i tak jest. Musisz zapisac 8B. Zapisujesz tylko 6 i przez to sie sypie. Druga skladowa jest zapisywana na ostatnich 4 bajtach, pierwsza na pierwszych 2. Bajt trzeci i czwarty nie sa wykorzystywane. Wynika to z tzw. wyrownania naturalnego.

Jak korzystasz z fwrite i fread do zapisu i odczytu struktur, to zawsze umieszczaj w wywolaniu sizeof(), bo na roznych architekturach rozmiar moze byc rozny.

0

Jeśli podaje z sizeof(h) to też nie działa tak jak powinno, tylko ta druga wersja działa dobrze czyli na to samo wyszło... A tak poza tym to jakim cudem pierwsza struktura zajmuje 8 bajtów?? Jeśli sizeof (short int) daje 2 bajty a sizeof(long int) daje 4?? Czyli w sumie 6. Próbowałem zamiast long int dać po prostu int ale też dupa :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1