Jak szybko wczytać plik

AklimX

Normalnie plik wczytujemy tak:

var
  TF : TextFile;
  S : String;
begin
  if not FileExists('C:\plik.txt') then
    ShowMessage('Sry, plik nie istnieje :/')
  else
  begin
    AssignFile(TF, 'C:\plik.txt');
    Reset(TF);
    while not eof(TF) do
    begin
      Readln(TF, S);
      ListBox1.Items.Add(S);
    end;
    CloseFile(TF);
  end;
end;

Jednak czasem dużo wygodniej (szybciej/krótszy kod) jest skorzystać z metody klas dziedziczących po TStrings

var
  data : TStringList;
begin
  if not FileExists('C:\plik.txt') then
    ShowMessage('Sry, plik nie istnieje :/')
  else
  begin
  data := TStringList.Create;
  data.LoadFromFile('c:\plik.txt');
  ListBox1.Items.Assign(data);     // sprawdź też działanie metody Append(data)
  data.free;
end;
end;

W ten sposób wczytaliśmy dane do zmiennej data. Możemy się do niej odwoływać jak do zwykłej tablicy ciągów znaków. Jednak musisz pamiętać, że pierwszy znak w obiekcie klasy string jest pod indeksem 1. Linie numerowane są od 0.

--- plik.txt ---
Aklimx
Witaj! Miłego dnia
--- plik.txt ---

ListBox1.Items.Add(data[0]);       // Aklimx
ListBox1.Items.Add(data[0][6]);   // x
ListBox1.Items.Add(data[1][6]);   // !

Zobacz też:

[[Delphi/Kompendium/Rozdział 7|Rozdział 7. Obsługa plików]] [[Delphi/Pliki]]
FAQ

3 komentarzy

Delphi, jak otworzyć plik pdf [delphi, otwieranie pliku pdf]

Do otwarcia pliku zewnętrznego (txt, pdf), jeśli chcesz go otworzyć w jego domyślnym programem (np. Notatnik lub Adobe Reader), można użyć połączenia interfejs API ShellExecute

  1. w uses dodać ShellApi

  2. procedure TMasterMind04.InstructionsClick(Sender: TObject);
    begin

ShellExecute (Handle, 'open', 'c://ef90.pdf', nil, nil, SW_SHOWNORMAL);

end;

tutaj otwieranie idzie z menu ale może być z buttona itd.

Hmmm... czy aby na pewno jest to szybszy sposob (pod wzgledem czasu wykonania)? Testowales ten kod?

Przy wielkich plikach IMO ten drugi kod bedzie strasznie pamieciozerny, aby odczytac plik na ktorym bedziemy edytowac aplikacja zaalokuje wymagana pamiec co moze byc zabojcze dla programu.

Czas wykonywania jest bardzo zbliżony, wręcz identyczny... IMO dużo wygodniej jest tak wczytywać plik - nie trzeba się zastanawiać czy Reset() przewija wskaźnik na koniec czy też nie.

Co do pamięciożerności, to rzeczywiści wczytywanie dużych plików może sprawić problem, ale do większych plików użyłbym raczej strumieni.