Entwickler-Ecke

Dateizugriff - in Datei mehrere versch. Record Typen speichern


Dede - Sa 04.09.04 16:18
Titel: in Datei mehrere versch. Record Typen speichern
Mein Problem ist derzeit das ich mehrere Daten von versch. Record Typen habe. Die würde ich nämlich gerne zusammen in einer Datei speichern.

Eine Sache hab ich schon ausprobiert hatte allerdings nicht den nötigen Erfolg.
Ich habe mir einen Header definiert, der angibt, wieviele Datensätze von den versch. Record Typen in der Datei sind. Im Prinzip so:


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:
tHeader = record 
                  AnzahlDatensätzevonRecord1 : Integer;
                  AnzahlDatenSätzevonRecord2 : Integer;
                end;
tHeaderFile = file of tHeader;

tRecordItem1 = record
                 ... //Hier halt die Definition
               end;
tRecordArrItem1 = array of tRecordItem1;
tRecordItem1File = file of tRecordItem1;

// Die Definition von tRecordArrItem2 ist ähnlich
...
procedure SaveToFile (RecordArrItem1 : tRecordArrItem1; RecordArrItem2 : tRecordArrItem2, FileName : string);
var HeaderFile : tHeaderFile
    Header : tHeader;
    RecordItem1File : tRecordItem1File;
begin
  AssignFile(HeaderFile,FileName);
  Rewrite(HeaderFile);
  Header.AnzahlDatensätzevonRecord1 := Length(RecordArrItem1);
  Header.AnzahlDatensätzevonRecord2 := Length(RecordArrItem2);
  Write(HeaderFile,Header);
  CloseFile(HeaderFile);

  AssignFile(RecordItem1File,FileName);
  Reset(SpellFile); // Hier das erste Problem, das Reset setzt FilePointer wieder zurück auf den Anfang :(

  for i:= 0 to Length(RecordArrItem1)-1 do
    Write(RecordItem1File,RecordArrItem1);
  CloseFile(RecordItem1File);

  // Hier würde nun das Item2 kommen...
end;


ich hoffe ich hab mich etwas verständlich ausgedrückt...

Gruß
Dede


Viper - Sa 04.09.04 17:18

Hallo Dede.

Ich würde das einfach über einen FileStream machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  i: integerM
  FileStr: TFileStream;
begin
  FileStr := TFileStream.Create('Dateiname', fmCreate);
  try
    //1. Record-Typ in die Datei speichern
    FileStr.Write(AnzahlRecord1, SizeOf(Integer) );
    for i := 0 to AnzahlRecord1 - 1 do
      FileStr.Write(DeinRecord1[i], SizeOf(TDeinRecord1) );
    
    //2. Record Typ speichern
    //ähnlich wie oben...
end;


Ich habe jetzt einfach andere Variablennamen verwendet, trotzdem ist ja wohl klar was gemeint ist.
Beim Laden der Datei einfach:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
FileStr := TFileStream.Create('Dateiname', fmOpenRead);
//und...
FileStr.Read(AnzahlRecord1, SizeOf(integer) );
setLength(DeinRecord1, AnzahlRecord1);
for i := 0 to AnzahlRecord1 - 1 do
  Str.Read(DeinRecord1[i], SizeOf(TDeinRecord1) );
//... das ganze halt für den 2. Typ


Dede - Sa 04.09.04 18:01

Hm... Da wäre ich jetzt selber wohl nicht drauf gekommen, werd ich nachher gleich mal ausprobieren.

Schonmal Vielen Dank

Gruß
Dede


Dede - Sa 04.09.04 19:10

Funktioniert wunderbar...

Dankeschön