Autor Beitrag
Shadow
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 19.08.02 11:57 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: So 08.09.02 13:36 
Titel: BlockRead/Write verwenden
Kleines Beispiel (hab's nicht ausprobiert):

ausblenden volle Höhe 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: