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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!