Rekordy i lista jednokierunkowa - jak zczytać rekordy z pliku do listy?

0

Definicja rekordu:

type  pElement=^lista;

       artysta = packed record
         name : String[32];
         sname : String[32];
         yob : Word;
         yod : Word;
         realm : String[32];
           end;
           lista = record
             dane : artysta;
             next: pElement;
           end; 

Funkcja oddająca element i sortująca względem name:

 procedure insert(name,sname:String;yob,yod:Word;realm:string;var FFirst:pElement);
var
current : pElement;
previous : pElement;
begin
  current:=FFirst;
  if (FFirst=nil) then
  begin
   new(FFirst);
   FFirst^.dane.name:=name;
   FFirst^.dane.sname:=sname;
   FFirst^.dane.yob:=yob;
   FFirst^.dane.yod:=yod;
   FFirst^.dane.realm:=realm;
   FFirst^.next:=NIL;
  end
   else if (name<=FFirst^.dane.name) then
        begin
        new(current);
          current^.dane.name:=name;
   current^.dane.sname:=sname;
   current^.dane.yob:=yob;
   current^.dane.yod:=yod;
   current^.dane.realm:=realm;
         current^.next:=FFirst;
         FFirst:=current;
        end
         else begin
               while (current^.next<>nil) and (current^.next^.dane.name<name) do
                begin
                 current:=current^.next;
                end;
               previous:=current;
               new(current);
                current^.dane.name:=name;
                current^.dane.sname:=sname;
                current^.dane.yob:=yob;
                current^.dane.yod:=yod;
                current^.dane.realm:=realm;
                current^.next:=previous^.next;
               previous^.next:=current;
              end;
end;

Funccja zapisująca:

 procedure Save(FFirst:pElement);
  var t : pElement;
begin
try
  assignfile(DataBase, 'artysci.dat');
  rewrite(DataBase);
  t:=FFirst;
  while t<>nil do
    begin
      write(DataBase, t^.dane);
      t:=t^.next;
    end;
  closefile(DataBase);
 except
 end;
end;

Mam problem z procedurą wczytującą dane z pliku do listy:

function wczytajdolisty1(var FFirst:pElement;name,sname:string;yod,yob:integer;realm:string):pElement;

var
current,prev:pElement;
danew:artysta;
begin
new(current);
current^.next:=nil;
current^.dane.name:=name;
current^.dane.sname:=sname;
current^.dane.yob:=yob;
current^.dane.yod:=yod;
current^.dane.realm:=realm;
if FFirst=nil then
begin
   FFirst:=current;
end else
  begin
  prev:=FFirst;
  while prev^.next<>nil do
   begin  prev:=prev^.next;  end;
     prev^.next:=current;
     end; result:=FFirst;
      end; 

Spędziłem nad tym parę godzin i nie wiem, gdzie leży błąd. Proszę o pomoc. Z góry dziękuje. :)

0

Do pliku zapisujesz albo całe rekordy, albo tylko ich dane - mniej będziesz się głowił, jak zapiszesz tylko dane z każdego węzła listy; Przy odczycie listy z pliku, najpierw tworzysz nowy węzeł, podpinasz go pod listę, a następnie ładujesz dane z pliku do pól rekordu;

Twój kod jest jakiś dziwny - nie mam pojęcia po co wczytajdolisty1 to funkcja, po drugie nie mam pojęcia po co tyle tych parametrów i po co one w ogóle są w tej funkcji; Dane masz wczytać z pliku, więc ewentualnie do procedury przekaż wskaźnik na węzeł, a w niej wczytuj dane z pliku i wpisuj do pól rekordu;

No i nie wiadomo czym jest i jakiego typu jest zmienna (globalna..?) DataBase, więc i nie wiadomo jakiego typu jest plik - czy tekstowy, czy amorficzny, czy typowany...

A najlepiej to zaglądnij do tego artykułu i zrób to porządnie.

0

No więc poprawiłem całość, ale pojawił się kolejny problem. Przy wczytywaniu rekordu z pliku do String Grida:

const ELEMENT_DATA_SIZE = SizeOf(artysta);
 procedure wyswietl1(AFileName : String;stringgrid1:TStringGrid);
var
  LoadFile : TFileStream;
  ToLoad   : artysta;
  w:integer;
begin
  LoadFile := TFileStream.Create(AFileName, fmOpenRead);
  try
    while LoadFile.Position < LoadFile.Size do
    begin
      LoadFile.ReadBuffer(ToLoad, ELEMENT_DATA_SIZE);
      wypisz(ToLoad,stringgrid1,w);
      w:=w+1;
    end;
  finally
    FreeAndNil(LoadFile);
  end; 
procedure wypisz(ToLoad:artysta;stringgrid1:TStringGrid;w:integer);
begin
      stringgrid1.Cells[0,w]:=(ToLoad.name);
      stringgrid1.Cells[1,w]:=(ToLoad.sname);
      stringgrid1.Cells[2,w]:=(inttostr(ToLoad.yob));
      stringgrid1.Cells[3,w]:=(inttostr(ToLoad.yod));
      stringgrid1.Cells[4,w]:=(ToLoad.realm);
end; 

Wyskakuje stream read error.

0

Chce wyświetlić zawartość pliku w stringgridzie. W pliku zapisane są rekordy.

0

@like78 - w procedurze wyswietl1 nie inicjujesz wartości początkowej dla zmiennej w; W pętli przekazujesz ją do procedury wypisz, w której uzywana jest do określenia indeksu wiersza, w którym zostaną dodane dane z rekordu; Tyle że nie wiadomo jaką ma wartość początkową ta zmienna, więc i nie wiadomo od którego wiersza komponentu będą dodawane informacje.

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