Jak zapisac tablice dynamiczna do pliku?

0

Mam maly problem.
Delphi nie pozwala zapisywac tablicy dynamicznej do pliku, nawet po zdefiniowniu jej dlugosci.
Czy ktos moglby pomoc rozwiazac ta kwestia?

0

Jeżeli tablica jest recordowa to przez recordy.
Lub przez record jednobajtowy.
To wyjdzie napewo, może???? ort! przez strumień????

0

Ile jeszcze razy bede to pisal :-[ :-[

a: array of costam
f: file of costam

assignfile(f, nazwa);
zapis
Rewrite(f);
BlockWrite(F, a[0], Length(a));

odczyt

Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f));

0

Ile jeszcze razy bede to pisal :-[ :-[

a: array of costam
f: file of costam

assignfile(f, nazwa);
zapis
Rewrite(f);
BlockWrite(F, a[0], Length(a));

odczyt

Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f));

mozna i tez tak:
a: array of costam
f: file of costam

assignfile(f, nazwa);
zapis
Rewrite(f);
for i:=0 to n do
Write(f, a[i]);

odczyt

Reset(f);
i := 0;
while not Eof(f) do
begin
Read(f, a[i]);
i := i + 1;
end;

0

mozna i tez tak:

Pewnie, że można, tylko bedzie wolniej.

0

Gdyby to bylo tak proste jak to napisal Piasiu, to bym sie nie pytal. Jednakze typ plikowy w Delphi nie moze zawierac tablic dynamicznych.
A wracajac do blockwrite i blockread, pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.

0

No przeciez juz wlasciwie masz napisane... Ale jak nie rozumiesz, to ci napisze raz jeszcze.
type myrec = record a: integer; b: integer; end;
a: array of myrec
f: file of myrec
procedure zapisz(nazwa: string);
begin
assignfile(f, nazwa);
Rewrite(f);
BlockWrite(F, a[0], Length(a)); colsefile(f);
end;
procedure odczyt(nazwa: string);
begin
assignfile(f, nazwa); Reset(f);
SetLength(a,FileSize(F));
BlockRead(f, a[0], FileSize(f)); closefile(f);
end;
Prosciej sie nie da wytlumaczyc. Aha... Jakbys sie nie zorientowal, to zapisuje sie procedura zapis, a odczytuje procedura odczyt, podajac w parametrze nazwe pliku.

0

Adam.Pilorz nie zrozumiales mnie. Nie chce zapisywac poszczegolnych rekordow tylko od razu cala tablice. Budujac chociazby taka tablice

TRec = array of record
       array of costam;
       array of costam;
       end;

juz jest problem.

0

pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.

Ja bym to zrobil tak

TRec=packed record
a: string[10];
b: string[10];
end;

AR: array of TRec;
F: file of TRec;

i dalej jak u mnie

jesli koniecznie musisz miec tyb tablicowy, to

po definicji typu rekordowego daj

TTab=array of TRec;

var
AR: TTab;
F: file of TRec;

i tak dalej

0

[quote
Ja bym to zrobil tak

TRec=packed record
a: string[10];
b: string[10];
end;

AR: array of TRec;
F: file of TRec;

i dalej jak u mnie

jesli koniecznie musisz miec tyb tablicowy, to

po definicji typu rekordowego daj

TTab=array of TRec;

var
AR: TTab;
F: file of TRec;

i tak dalej
</quote>
i tak dlej czyli
blockwrite(f,ar[0].a, ...itd.
To jest to samo co zaproponowal Adam.Pilorz. Zapisywanie pojedynczego rakordu. Mi chodz o zapisanie calej tablicy w jednej operacji tak jak to mozna zrobic ze zwykla tablica

Type
  TRec = array[0..10] of costam;
procedure zapisz;
var
  dane:TRec;
  f:file of TRec;
begin
  assignfile(...)
  reset(...)
  write(f,dane);
  closefile(...);
end;

To wszyscy wiedza, ale gdyby teraz zamienic
TRec = array[0..10] of costam;
na
TRec = array of costam;
W jaki sposob zapisac zmienna 'dane', a nie poszczegolne komorki
(dane[0],dane[1]...)??

0

Gdyby to bylo tak proste jak to napisal Piasiu, to bym sie nie pytal. Jednakze typ plikowy w Delphi nie moze zawierac tablic dynamicznych.
A wracajac do blockwrite i blockread, pq jak bys mogl podac konkretny przyklad programu np. dla takiego typu
TTab = array of record
a:string[10];
b:string[10];
bo mi cos nie bardzo wychodzi.

type TTab=array of record
            a:packed array of word;
            b:packed array of byte;
          end;

procedure save({const} name:pchar;var t:ttab);  {const - if You want}
var f:file;
    i,k:cardinal;
begin
  assign(f,name);
  rewrite(f,1);
  k:=length(t);
  blockwrite(f,k,sizeof(cardinal));
  for i:=0 to length(t)-1 do
    with t[i]do
      begin
        k:=length(a);
        blockwrite(f,k,sizeof(cardinal)); {or 4 or sizeof(k) - whatever}
        blockwrite(f,a,k*sizeof(word));   {or k*2 or k*sizeof(a[0]) - whatever}
        k:=length(b);
        blockwrite(f,k,sizeof(cardinal));
        blockwrite(f,b,k*sizeof(byte))    {blockwrite- that's why array must be packed}
      end;
  closefile(f)
end;

procedure load({const} name:pchar;var t:ttab);
var f:file;
    i,k:cardinal;
begin
  assign(f,name);
  reset(f,1);
  blockread(f,k,sizeof(cardinal));
  setlength(t,k);
  for i:=0 to length(t)-1 do
    with t[i]do
      begin
        blockread(f,k,sizeof(cardinal));
        setlength(a,k);
        blockread(f,a,k*sizeof(word));
        blockread(f,k,sizeof(cardinal));
        setlength(b,k);
        blockread(f,b,k*sizeof(byte))
      end;
  closefile(f)
end;

function checkout:string;
const check:array[boolean]of string=('fuckin'' stupid flabra !!!','flabra is right.'); {we'll see}
var tab1,tab2:ttab;
    j,k:cardinal;
    flabra:boolean;
begin
  randomize;                            {randomize: all in God's hands}
  setlength(tab1,random(20));
  for j:=0 to length(tab1)-1 do
    with tab1[j]do
      begin
        setlength(a,random(100));
        for k:=0 to length(a)-1 do a[k]:=random(65536);
        setlength(b,random(200));
        for k:=0 to length(b)-1 do b[k]:=random(256)
      end;
  save('tabsave.dat',tab1);
  load('tabsave.dat',tab2);
  flabra:=(length(tab1)=length(tab2));   {primo true/false}
  if flabra then                         {if length(tab1)=length(tab2)then }
    for j:=0 to length(tab1)-1 do        {secundo ; tab1 or tab2 - whatever - the same length}
      begin
        flabra:=flabra and(length(tab1[j].a)=length(tab2[j].a)); {tercio - we'll check everything !!!}
        flabra:=flabra and(length(tab1[j].b)=length(tab2[j].b)); {quadro}
        if flabra then
          begin
            for k:=0 to length(tab1[j].a)-1 do              {tab1/tab2 - whatever - the same length}
              flabra:=flabra and(tab1[j].a[k]=tab2[j].a[k]);{quinto - H. Quinto - Vabanque! :) }
            for k:=0 to length(tab2[j].b)-1 do              {tab2/tab1}
              flabra:=flabra and(tab1[j].b[k]=tab2[j].b[k]) {seks... jak to k***a było ?!}
          end
      end;
  result:=check[flabra]
end;

var is_he_stupid:string;
begin
  {proponuję wstawić brejkpojnta do następnej linii i sprawdzić wartość is_he_stupid w łotczach}
  is_he_stupid:=checkout
  {wersji w c/c++ nie chce mi się robić ;) }
end.

Łapiesz o co cho? Musisz również zapisać rozmiar
tablicy, żebyś wiedział ile komórek masz zawsze
czytać. :)

0

Może jeszcze to sie przyda (zapis dynamicznej tablicy dwuwymiarowej - rowniez nieprostokatnej):

http://4programmers.net/Forum/viewpost.html?id=102763

0

Heh, sorka, pq, że Ci jeszcze nie podziękowałem za to, że mi pomogłeś, ale strasznie mnie pochłąnęła praca na Saperem, w każdym razie, dzięki, że mi wtedy pomogłeś... [hurra]

//spox Loczek. pq

1 użytkowników online, w tym zalogowanych: 0, gości: 1