Wczytanie danych listy jednokierunkowej z pliku tekstowego

0

Co muszę zmienić, żeby program poprawnie wczytał tekst z notatnika jeśli będzie w takiej wersji?
np.

Jan; Kowalski; 22
Jacek; Nowak; 15

Jak na razie to mi działa jest mam tak zapisane:

Jan
Kowalski
22
procedure DodajZPlikuKolejka(var Pocz : PLista; var Kon : PLista; var Plik : TextFile);
var
  I : Integer;
  S : String;
  Nowy : PLista;
begin
  AssignFile(plik,'C:\Users\Desktop\wczytaj.txt');
  reset(plik);
  while not eof(Plik) do
  begin
    new(Nowy);
    readln(Plik, S);
    Nowy^.Dane.Imie:= S;
    readln(Plik, S);
    Nowy^.Dane.Nazwisko:= S;
    readln(Plik, I);
    Nowy^.Dane.Wiek:= I;
    if (Pocz = nil) then
    begin
      Pocz := Nowy;
      Pocz^.Wsk := nil;
      Kon := Pocz;
    end else
    begin
      Kon^.Wsk := Nowy;
      Kon := Nowy;
      Kon^.Wsk := nil;
    end;
  end;
  CloseFile(plik);
end;
 
0

@morodis - nie używaj plików tekstowych o takiej składni, bo utrudniasz sobie deserializację danych; Taka postać przypomina pliki CSV, jednak aby wyodrębnić składowe linii, trzeba by jakoś je parsować :]

Sugeruję użyć plików INI - będzie o wiele, o wiele łatwiej:

[List]
NodesCount=2

[Node 0]
Name=Jan
Surname=Kowalski
Age=22

[Node 1]
Name=Jacek
Surname=Nowak
Age=15

Klasa TIniFile umożliwi Ci wygodny odczyt i zapis danych;

PS: Zobacz też do tego posta i zastosuj się to podanych wskazówek, jeśli o samą listę chodzi.

1

jeśli dane rzeczywiście w pliku masz oddzielone średnikami to proponuję użyć najzwyczajniejszej TStringList oraz ExtractStrings dzięki temu robiąc prostą pętle dostaniesz się do tego co potrzebujesz. Jak nie wiesz jak to zrobić to poniżej demko:

procedure TForm1.Button1Click(Sender: TObject);
var
  sl, sLine: TStringList;
  i, j: Integer;
begin
  sl := TStringList.Create;
  sLine := TStringList.Create;
  try
    sl.LoadFromFile('c:\p.csv');
    for i := 0 to sl.Count - 1 do
    begin
      sLine.Clear;
      ExtractStrings([';'], [' '], PWideChar(sl[i]), sLine);
      if i = 0 then
      begin
        StringGrid1.RowCount := sl.Count;
        StringGrid1.ColCount := sLine.Count;
      end;
      for j := 0 to sLine.Count - 1 do
        StringGrid1.Cells[j, i] := sLine[j];
    end;
  finally
    sLine.Free;
    sl.Free;
  end;
end;

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