Odczyt z pliku (File of Type)

0

Witam, mam taki mały problem z odczytywaniem danych z pliku do zmiennej nowego typu. Dajmy na to mam typ:

Type
	TYP = record
		ZMIENNA: Word;
	End;

i dwu bajtowy plik, np. FFDD

po odczytaniu pliku w sposób następujący:

var Dane: TYP;

procedure odczytaj(NazwaPliku: TFileName);
var FT: File of TYP;
begin
	AssignFile(FT, NazwaPliku);
	Reset(FT);
	Read(FT, Dane);
	CloseFile(FT);
end;

i teraz gdy zmienna Dane zawiera dane odczytane z pliku gdy ją odczytam otrzymuje liczbę 56831 czyli DDFF a nie FFDD (65501).

Cały zamysł jest taki, że chciałem odczytać nagłówek pliku. a on mi jakoś te dane na opak czyta :P. Pewnie tak ma być jednak czy dało by się to jakoś zmienić, mogę bajt po bajcie odczytać plik i wpisać do zmiennej, ale tak by było wygodniej jak by to działąło w ten sposób.

0
var ft: file of word;

?

0

No właśnie mógłbym ale chodziło mi o wygodę, skoro mogę poprzez odczytanie danych już wsadzić je uporządkowane w zmiennych w rekordzie to chciałem tak odczytać nagłówek pliku BMP. Więc typ już trochę się komplikuje. Sposób bajt po bajcie już przerabiałem, teraz chciałem być sprytniejszy ;]

A oto typ

type
  TBMPHeader = record
    bfType: WORD;
    bfSize: DWORD;
    bfReserved1: WORD;
    bfReserved2: WORD;
    bfOffBits: DWORD;
    biSize: DWORD;
    biWidth: DWORD;
    biHeight: DWORD;
    biPlanes: WORD;
    biBitCount: WORD;
    biCompression: DWORD;
    biSizeImage: DWORD;
    biXPelsPerMeter: DWORD;
    biYPelsPerMeter: DWORD;
    biClrUsed: DWORD;
    biClrImportant: BYTE;
    biClrRotation: BYTE;
    biReserved: WORD;
  end;
0

a nie latwiej uzyc czegos gotowego z internetu? tysiace osob, tysiace razy robilo juz cos takiego, po co zaczynac od nowa i sie z tym meczyc...?

0
cimak napisał(a)

a nie latwiej uzyc czegos gotowego z internetu?

No właśnie dzięki takiemu podejściu mamy niedouczone społeczeństwo i setki postów, które - między innymi - i Ty krytykujesz.

0

Doszedłem do wniosku, że po prostu tak ma być.

Coś co mnie niepokoiło to to, że rekord miał 56bajtów w sieci znalazłem coś takiego jak packed. Pomogło i rekord miał teraz 54bajty jak to powinno być (nagłówek pliku bmp ma 54bajty). Lecz dalej niby to odwrócone były wartości. Jednakże sprawdzałem ciągle 1 wartość (bmType) i zawsze wydawała się być odwrócona.

Wcześniej bez zdefiniowania rodzaju rekordu jako packed dane z pliku trafiały w złe zmienne i wychodziły dziwne liczby. Z packed już jest ok i udało się odczytać np. szerokość bitmapy.

Dochodzę do wniosku, że w tym był pies pogrzebany. Tak teraz wygląda definicja rekordu:

type
  TBMPHeader = packed record
    bfType: WORD;
    bfSize: DWORD;
    bfReserved1: WORD;
    bfReserved2: WORD;
    bfOffBits: DWORD;
    biSize: DWORD;
    biWidth: DWORD;
    biHeight: DWORD;
    biPlanes: WORD;
    biBitCount: WORD;
    biCompression: DWORD;
    biSizeImage: DWORD;
    biXPelsPerMeter: DWORD;
    biYPelsPerMeter: DWORD;
    biClrUsed: DWORD;
    biClrImportant: BYTE;
    biClrRotation: BYTE;
    biReserved: WORD;
  end;

Odczyt:

  var Header: TBMPHeader;
  {...}
  BMPFile := TFileStream.Create(Filename, fmOpenRead);
  BMPFile.ReadBuffer(Header, SizeOf(TBMPHeader));
  BMPFile.Free;

Piszę to wszystko tutaj dla tych którzy możliwe, że będą mieli ten sam problem.

0

i dwu bajtowy plik, np. FFDD

i teraz gdy zmienna Dane zawiera dane odczytane z pliku gdy ją odczytam otrzymuje liczbę 56831 czyli DDFF a nie FFDD (65501).

To normalne. Tak ma być. Poczytaj o „endianess”.
liczba 56831d = DDFFh zapisywana jest jako dwa bajty, kolejno: 255d=FFh, 221d=DDh. Żeby nie pomylić, gdy podajemy kolejne bajty w pliku czy pamięci zapisujemy je ze spacją:
FF DD
co przy little-endian oznacza liczbę
DDFFh czyli 56831.

. a on mi jakoś te dane na opak czyta :P.
czyta dobrze. to ty na opak to interpretujesz ;-)

0

A czytałeś i zapisywałeś przez "dane.zmienna"?

0

Odczytując z pliku dane wielobajtowe trzeba wiedzieć, w jakiej formie są one zapisane: little endian (LSB jako pierwszy, forma procesorów x86) czy big endian (MSB jako pierwszy, forma procesorów Motoroli). W niektórych plikach jest to jednoznacznie określone (np dane Exif w plikach jpg - odczytuje się tzw. ByteOrder i wiadomo w jakiej formie zapisane są następne dane).

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