Avatar billede whynot Nybegynder
18. december 2003 - 13:20 Der er 11 kommentarer og
1 løsning

Gemme 2d array til fil

jeg prøver at gemme et 2d array i en fil med TFileStream.. men jeg får en access vio. når jeg prøver at læse fra filen igen.

jeg følgende :

gem array...

filnavn:='entest.txt';
assignFile(fil, filnavn);
Rewrite(fil);
closefile(fil);
with Tfilestream.create(filnavn, fmOpenWrite) do
begin
  wrtie(mitarray, sizeof(mitarray));
  free;
end;

hent fra fil...
with Tfilestream.create(filnavn, fmOpenRead) do
begin
  read(mitarray, sizeof(mitarray));
  free;
end;


hvad pokker gør jeg galt?
Avatar billede borrisholt Novice
18. december 2003 - 13:47 #1
Hvordan er MitArray erklæret
Avatar billede whynot Nybegynder
18. december 2003 - 13:50 #2
type
  TMatrix_array = array of array[0..53] of string;

var
mitarray: TMatrix_array;
Avatar billede whynot Nybegynder
18. december 2003 - 13:52 #3
Er det ikke noget med at hvis det var et statisk array... ville jeg kunne have lavet en variabel som var af typen "file of TMatrix_array" ?

..og derefter blot gemt dem med en simpel write.
Avatar billede borrisholt Novice
18. december 2003 - 14:12 #4
For det første har du erklæret den ene dimmention Dynamisk.
Avatar billede borrisholt Novice
18. december 2003 - 14:12 #5
Nå men prøv det her :

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  SetLength(Matrix_Array, 30);
  for i := 0 to Length(Matrix_Array) - 1 do
    for j := 0 to 53 do
      Matrix_Array[i][j] := Format('[%d,%d]', [i, j]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
  HorseWrite: TWriter;
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create('Hest.txt', fmCreate);
  HorseWrite := TWriter.Create(FileStream, $FF);
  HorseWrite.WriteListBegin;
  for i := 0 to Length(Matrix_Array) -1 do
    for j := 0 to 53 do
      HorseWrite.WriteString(Matrix_Array[i][j]);
  HorseWrite.WriteListEnd;
  FreeAndNil(HorseWrite);
  FreeAndNil(FileStream);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: Integer;
  HorseReader : TReader;
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create('Hest.txt', fmOpenRead or fmShareDenyWrite);
  HorseReader := TReader.Create(FileStream, $FF);
  HorseReader.ReadListBegin;

  for i := 0 to Length(Matrix_Array) -1 do
    for j := 0 to 53 do
      Matrix_Array[i][j] := HorseReader.ReadString;

  HorseReader.ReadListEnd;
  FreeAndNil(HorseReader);
  FreeAndNil(FileStream);
end;


Jens B
Avatar billede borrisholt Novice
18. december 2003 - 14:12 #6
:-)
Avatar billede whynot Nybegynder
18. december 2003 - 14:59 #7
hvad gør:

Format('[%d,%d]', [i, j]);

...desuden sætter du længden til 30 i starten .. er der en grund til det?..eller er det fordi der er tale om et dynamisk array?

ellers ser det ud til at virke fino :)
Avatar billede whynot Nybegynder
18. december 2003 - 15:01 #8
desuden hvad betyder $FF i sætningen:

TWriter.Create(FileStream, $FF);
Avatar billede whynot Nybegynder
18. december 2003 - 15:16 #9
kan man ikke sætte gem-proceduren i en procedure...f.eks

procedure gemarray(v_array: Tmatrix);

..fordi jeg synes nemlig at jeg mister array'ets værdier når jeg sender arrayet igennem til proceduren.

gemarray(Matrix_Array);

..så gemmer den nemlig ingen værdier i filen.
Avatar billede borrisholt Novice
18. december 2003 - 15:26 #10
1)
  Format('[%d,%d]', [i, j]); skriver fx. [0,12] for det 12. element i den 0. række
1a)
  Jeg sætter størelsen til 30 fordi det er et Dynamisk Array. Noget skulle jeg finde på.
2)
  $FF er størelsen på den buffer jeg bruger .... Det har ikke den store betydning. Jeg bruger altid den størelse.
3)
  Jow da.
Det er bare at bruge den lokale variabel, i stedet for den globale.

Jens B
Avatar billede whynot Nybegynder
18. december 2003 - 16:55 #11
det er nogle fine svar - mange tak skal du have.!.. og du får dine points.. men jeg tænkte på om du for nogle flere points vil hjælpe mig med mit sidste delspørgsmål..?

Hvis jeg nu laver to functions som indeholder dine to knappers kode... altså:

function gemarray_tilfil(v_array: Tmatrix) : boolean;
..hvor den gemmer arrayet i en fil og returnere om det gik godt eller ej.

function hentarray_frafil(filnavn: string) : Tmatrix;
..hvor den henter arrayets data og returnerer arrayet.

hvad er der galt med ovenstående fremgangsmåde.. jeg mister nemlig arrayets indhold når jeg på baggrund af et klik på en knap sender mit array til en funktion.

f.eks.
if gemarray_tilfil(Matrix_array) = true then showshowmessage('det gik fint') else showmessage('det ikke ikke');

der bliver simpelthen ikke gemt noget i filen.. selvom at arrayet er FYLDT med data - meget skørt.

jeg håber du kan hjælpe mig med det sidste problem.. jeg er desperat så jeg giver dig gerne 45 points yderligere for en løsning på dette problem.
Avatar billede whynot Nybegynder
18. december 2003 - 18:19 #12
jeg idiot.. jeg glemte at sætte længden på den lokale variabel/array i functionen.. jamen så skulle det virke - dejligt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester