Entwickler-Ecke

Dateizugriff - Mehrere Datensätze unterschiedlichen Typs in einer Datei


SammySan - Di 15.04.03 08:10
Titel: Mehrere Datensätze unterschiedlichen Typs in einer Datei
Hallo ich hab da ein für mich kniffliges Problem


Ich nehm als praktisches Beispiel einfach mal eine Kartdatei für ein OpenGL Spiel (es ist ansich genau das wofür ich es brauche)



Ich weiß nicht ob es so in der Art geht, wenn wär das aber schön =)


also ich speicher am anfang der datei 3 word werte, diese kann ich ganz normal auslesen mit assignfile(f, 'bla.map'); reset(f); read(f, temp)..etc..

in diesen 3 Byte Werten stehen nun die Zahl der vorhandenen Datensätze

Beispiel:

im ersten Byte steht die Zahl 12, das heißt es sind 12 shortstrings (20 bytes lang) vorhanden, also würd ich die Startposition des Zeigers hinter die 3 wordsätze stellen und dann die leserart der Datei auf string ändern

nun weiß ich aus dem zweiten word wert das es 70 Rechteck-Records gibt (Größe 37 byte);
so, also setz ich den Dateizeiger auf 6*2bytes + 12*20 bytes, das heißt auf das byte 252, jetzt bin ich also an dem recordsteil angekommen, kann also nun meine records auslesen ....

mit dem 3ten Teil sollte dann ähnlich verfahren werden


Also praktisch gesehen wüsst ich wie das möglich wäre, ich suche eigentlich nur eine Möglichkeit den Dateizeiger byteweise zu versetzen

wenn es das nicht gibt wär es nett wenn mir jemand Tipps geben könnte wie das auch anders funktionieren würde


Klabautermann - Di 15.04.03 09:37

Hallo,

du suchsts nach Untypisierten Dateien Stichworte hirzu sind FILE, Blockread, Blockwrite, GetMem, Freemem oder tFileStream. Ein paar zusatzinfos auch zu einer Stream fertigen Strem Klasse findest du hier [http://www.delphi-forum.de/viewtopic.php?t=9624].

Gruß
Klabautermann


SammySan - Di 15.04.03 09:43

phew, klingt etwas komplizierter als die typisierten Dateien =)

Danke erstmal, ich werd mich mal reinarbeiten, mal gucken ob ich was hinkrieg


opfer.der.genauigkeit - Di 15.04.03 09:43

Mit typisierter Datei würd ich das in etwa so machen.

Du hast nen Record:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
pBspRec = ^tBspRec;  // muss man nich machen
tBspRec = packed record
  BspWord : word;
  BspByte : byte;

usw. 
end;

procedure SaveFile;
var 
  Stream : TCustomFileStream;
  pB : pBspRec;  // optional fals man mit pointern arbeiten will
  tB : tBspRec;
begin
  Stream := TCustomFileStream.Create('Dateiname',fmOpenReadWrite);
  if Stream.Open then begin
    FillChar(tB,SizeOf(tBspRec),0);
    tB.BspWord := pB^.BspWord; // Wert zuweisen
    tB.BspByte := 4;
    Stream.Write(tB,SizeOf(tBspRec));
  end;
  Stream.Free;
end;

procedure LoadFile;
var
  Stream : TCustomFileStream;
  pB : pBspRec;  // optional, fals man mit pointern arbeiten mag
  tB : tBspRec;
  i : integer;
begin;
  Stream := TCustomFileStream.Create('Dateiname',fmOpenRead);
  if Stream.Open then
    Stream.Read(tB,SizeOf(tBspRec));
  Stream.Free;


Ich hoffe ich konnt helfen. Keine Garantie, bin aber fest der Meinung, daß der funzt.


Klabautermann - Di 15.04.03 09:45

Hallo,
SammySan hat folgendes geschrieben:
phew, klingt etwas komplizierter als die typisierten Dateien =)

nur geringfügig. Du gibst halt bei jedem lesevorgang mit an, wieviele Bytes du lesen willst.

Gruß
Klabautermann