mega plik?

0

witajcie
no ostatnio spotkałem się z dziwną sytuacją, napisałem sobie programik, który zapisuje dane do pliku, tyle że plik to prawie 500kb*ilość zapisanych do niego rekordów, normalnie szok, albo o czymś zapomniałem [nuda] (każdemu się zdaża...) albo mi kom źle przelicza, hmmm, może ktoś pomoże co?

długi kodzik z najważniejszymi częściami
wszystkie dane mimo iż występują są puste, prócz tych związanych z imieniem (tab[i].imie)

type
  bitwa=packed record
    gracz1,gracz2,armia1,armia2:string[50];
    pts1,pts2,ptsl1,ptsl2:integer;
    opis:string[255];
    end;

type
  gracz=packed record
    imie:string[50];
    armia:string[50];
    winm,wins,winmi,losm,loss,losmi,r:integer;
    ptsl,ptssz,ptsss,roznica:integer;
    bitwy:array[1..1000]of bitwa;
    ilebitw:integer;
    end;

var
  Form1: TForm1;
    Mode: TDeviceMode;
  s:string;
  ExtendedStyle:Integer;
  p:string;
  ilegraczy,i,j,k:integer;
  plik:file of gracz;
  tab:array[1..1000]of gracz;
  tab1:array[1..1000]of gracz;
  nazwapliku:string[50];
  gr:gracz;
  
procedure TForm1.Zapiszbazdanych1Click(Sender: TObject);
begin
if (nazwapliku<>'')then
begin
  assignfile(plik,nazwapliku);
  rewrite(plik);
 for i:=1 to ilegraczy do
   begin

  gr.imie:=tab[i].imie;
  {gr.armia:=tab[i].armia;
  gr.winm:=tab[i].winm;
  gr.wins:=tab[i].wins;
  gr.winmi:=tab[i].winmi;
  gr.r:=tab[i].r;
  gr.losm:=tab[i].losm;
  gr.loss:=tab[i].loss;
  gr.losmi:=tab[i].losmi;
  gr.ptsl:=tab[i].ptsl;
  gr.ptssz:=tab[i].ptssz;
  gr.ptsss:=tab[i].ptsss;
  gr.roznica:=tab[i].roznica;
  gr.ilebitw:=tab[i].ilebitw;
  for k:=1  to tab[i].ilebitw do
    begin
    gr.bitwy[k].gracz1:=tab[i].bitwy[k].gracz1;
    gr.bitwy[k].gracz2:=tab[i].bitwy[k].gracz2;
    gr.bitwy[k].armia1:=tab[i].bitwy[k].armia1;
    gr.bitwy[k].armia2:=tab[i].bitwy[k].armia2;
    gr.bitwy[k].pts1:=tab[i].bitwy[k].pts1;
    gr.bitwy[k].pts2:=tab[i].bitwy[k].pts2;
    gr.bitwy[k].ptsl1:=tab[i].bitwy[k].ptsl1;
    gr.bitwy[k].ptsl2:=tab[i].bitwy[k].ptsl1;
    gr.bitwy[k].opis:=tab[i].bitwy[k].opis;
    end;      }
   write(plik,gr);
   end;
   closefile(plik);
end;
end;

0

wszystkie dane mimo iż występują są puste, prócz tych związanych z imieniem (tab[i].imie)

type
bitwa=packed record
gracz1,gracz2,armia1,armia2:string[50];
pts1,pts2,ptsl1,ptsl2:integer;
opis:string[255];
end;

type
gracz=packed record
imie:string[50];
armia:string[50];
winm,wins,winmi,losm,loss,losmi,r:integer;
ptsl,ptssz,ptsss,roznica:integer;
bitwy:array[1..1000]of bitwa;
ilebitw:integer;
end;

To, że Ty nie przypisujesz do tych zmiennych żadnych swoich wartości nie znaczy, że one nie zajmują miejsca...
a jeden rekord typu gracz zajmuje:
(250) + (124) + (1000 * (455 + 16) ) = 471148 Bajtów czyli około 500 kB

(250)[imie i armia] + (124)[zmienne integer] + (1000 * rekord bitwa - czyli (455[stringi] + 16[integer] )

A to, że masz packed reckord znaczy tylko tyle, że każdy kolejny typ danych nie zaczyna się od nowej komórki pamięci, tylko jest "upychany do końca poprzedniej".

0

tak też myślałem... eh a miałem nadzieję, że to coś innego :| ;-( cóż

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