Delete - Mo 19.08.02 11:57
Titel: BlockRead
Hi, hab einen OpenGL-Dartei Loader gemacht, der lädt eine Datei im Format f:TextFile, nun will ich mein eigenes Format benutzen, aber mit f:File und dazu muss ich wissen, wie das alles mit BlockRead und BlockWrite geht, kennt jemand gute Beispiele.
Hier mein Type, der gespeichert werden muss:
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:
| type TVertex=record x,y,z:Glfloat; end; TTexCoord=record U,V:Glfloat; end; TNormal=TVertex; TAll=record vertex:^TVertex; Tex:^TTexCoord; Nor:^TNormal; end; TFace=record nV:Integer; V:array of TAll; end;
TOBJFile=object verts:array of TVertex; norms:array of TNormal; texcoords:array of TTexCoord; face:array of TFace; nv:Integer; nt:Integer; nN:Integer; nf:Integer; procedure Load(Filename:String); procedure draw(Mode:Cardinal;Light,Texco:Boolean); end; |
Für die nicht wissen, was GLfloat ist, GLfloat ist das selbe wie Single.
Danke im Vorraus
Shadow
Andreas Pfau - So 08.09.02 13:36
Titel: BlockRead/Write verwenden
Kleines Beispiel (hab's nicht ausprobiert):
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:
| type TIrgendwas = record { ... } end; TNochwas = record { ... } end;
var Irgendwas: TIrgendwas; Nochwas: TNochwas;
procedure Speichern(Dateiname: String); var F: File; begin AssignFile(F, Dateiname); Rewrite(F, 1); // 1 = Byteweise schreiben BlockWrite(F, Irgendwas, SizeOf(Irgendwas)); BlockWrite(F, Nochwas, SizeOf(Nochwas)); CloseFile(F); end;
procedure Laden(Dateiname: String); var F: File; begin AssignFile(F, Dateiname); Reset(F, 1); // 1 = Byteweise lesen BlockRead(F, Irgendwas, SizeOf(Irgendwas)); BlockRead(F, Nochwas, SizeOf(Nochwas)); CloseFile(F); end; |
Wenn du bei Rewrite und Reset nicht noch zusätlich ", 1" angibst, werden immer mindestens 128 Byte geschrieben, was zu Fehlern führen kann und Speicherverschwenung ist.
BlockRead/BlockWrite haben noch einen 4. Parameter (Integer). In diesen wird geschrieben, wieviele Bytes tatsächlich geschrieben bzw. gelesen wurden. Wenn BlockWrite weniger als SizeOf(Typ) zurückgibt, ist der Datenträger voll, wenn BlockRead weniger als SizeOf(Type) zurückgibt, ist die Datei zu klein (ungültig).
Noch was: probier nicht, dynamische Speicher (z.B. String) damit zu speichern. Dabei wird nur die Adresse gespiechert, spätestens nach dem reboot ist alles weg.
Viel Spaß beim coden! :wink: