Entwickler-Ecke

Dateizugriff - Probleme beim speichern eines Records


NeoXan - So 07.09.03 12:28
Titel: Probleme beim speichern eines Records
Hier ist der Record


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  aEvo = record
    first       : array[1..6] of integer;
    second        : integer;
    third     : integer;
    fourth, fifth : integer;
  end;
  paEvo = ^aEvo;


gespeichert wird so...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
   myFile   : File of aEvo; 
             n : paEvo;  
begin
   AssignFile(myFile, 'C:\Test.evo');
   ReWrite(myFile);
   Write(myFile, n^);
   CloseFile(myFile);
end;


und gelesen so...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
   AssignFile(myFile, 'C:\Test.evo');
   FileMode := fmOpenRead;
   Reset(myFile);

  while not Eof(myFile) do
   begin
    Read(myFile, n^);
     ShowMessage('DIR => '+IntToStr(n^.third)+chr(10)+chr(13)+'Health => '+IntToStr(n^.second));
   end;
 CloseFile(myFile);


Der Array müsste doch einfach so mitgespeichert werden oder gibt es da noch etwas zu beachten...

Das Prob ist einfach, dass ich die Datei offensichtlich richtig speichern kann...sie aber nicht mehr richtig lesen kann???


Keldorn - So 07.09.03 12:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
ar
   myFile   : File of aEvo; 
             n : aEvo;   //<---
begin
   AssignFile(myFile, 'C:\Test.evo');
   ReWrite(myFile);
   Write(myFile, n);  //<---
   CloseFile(myFile);
end;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
   AssignFile(myFile, 'C:\Test.evo');
   FileMode := fmOpenRead;
   Reset(myFile);

  while not Eof(myFile) do
   begin
    Read(myFile, n);  //<---
     ShowMessage('DIR => '+IntToStr(n.third)+chr(10)+chr(13)+'Health => '+IntToStr(n.second));
   end;
 CloseFile(myFile);


oder

vor assignfile

Delphi-Quelltext
1:
new(n);                    

ist ja nur ein pointer, und da mußt du noch Speicher zuweisen. wobei für mich die erste Variante einfacher wäre.

Mfg Frank


Klabautermann - So 07.09.03 14:51
Titel: Re: Probleme beim speichern eines Records
Hallo,
NeoXan hat folgendes geschrieben:
Hier ist der Record


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  aEvo = record
    first       : array[1..6] of integer;
    second        : integer;
    third     : integer;
    fourth, fifth : integer;
  end;
  paEvo = ^aEvo;


den Record solltest du noch um das Wörtchen Packed erweitern. Dann werden (wahrscheinlich) die Dateien kleiner, auf jeden Fall bleibt aber die Kompatibilität gegeben, wenn du dein Programm mal unter einer anderen Delphi Version oder mit anderen Grundeinstellungen Compilierst.
Also so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  aEvo = packed record
    first       : array[1..6] of integer;
    second        : integer;
    third     : integer;
    fourth, fifth : integer;
  end;


Gruß
Klabautermann


NeoXan - So 07.09.03 15:54

Ok, also ich stell die Frage mal ganz anders...denn bei mir klappt gerade gar nichts :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  aEvo = record
    gene       : array[1..6] of integer;
    dir        : integer;
    health     : integer;
    xpos, ypos : integer;
  end;
  paEvo = ^aEvo;

var
  Evolve     : TEvolve;
  bugs       : Tlist;

implementation



Delphi-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:
procedure Init;
var
  t, l : integer;
  p    : paEvo;
  w, h : integer;
  x, y : integer;
begin
  bugs:=tlist.create;
  randomize;

  for t:=1 to 100 do begin
    new(p);
    for l:=1 to 6 do
      p^.gene[l]:=random(10);
    p^.xpos:=random(500);
    p^.ypos:=random(350);
    p^.health:=100;
    p^.dir:=1;
    bugs.add(p);
  end;

  for t:=0 to 99 do begin
    p:=bugs[t];
    x:=p^.xpos;
    y:=p^.ypos;
  end;

  for t:=1 to 6 do begin
    xdir[t]:=round(cos(pi/3*t)*5);
    ydir[t]:=round(sin(pi/3*t)*5);
  end;

end;


soah...es werden also...sagen wir mal Käfer erstellt und in einem IMG platziert...nun möchte ich einfach die Pos, Health, Gene's etc. alles abspeichern um dann später wieder zu öffnen...etc...aber das klappt irgendwie nicht ganz so richtig... :/

Desweiteren bräuchte ich glaube ich noch einen Wert der festlegt, wie viele Käfer abgespeichert wurden...wegen dem wieder öffnen...oder geht es auch so...


Klabautermann - So 07.09.03 19:44

Hallo,

hier [http://downloads.oitmann.de/samples/] findest du ein Beispiel (TypeFileDemo). Dort werden die wichtigsten Befehle auch zum feststellen der Dateilänge und dem Positionieren des Dateizeigers.

Gucke es dir mal an, vieleicht beantwortet das ja schon deine Fragen.

Gruß
Klabautermann