Вопрос: Лучший способ для чтения и записи текстового файла


Я использую последнюю версию Lazarus IDE, и у меня есть Memo1 на моем TForm1. Мне нужно загрузить текстовый файл в Memo1 а затем отредактируйте каждую строку заметки (я использую Memo1.Lines.Strings[i] := ...). В конце я должен сохранить отредактированную записку по определенному пути.

Вопрос : Я ищу более быстрый путь между:

  1. Загрузите весь текст внутри заметки, отредактируйте его содержимое и сохраните в новый файл (загрузите все -> отредактируйте все -> напишите все)
  2. Сделайте while цикл (до конца моего *.txt файл), который читает файл по строкам, редактирует содержимое и сохраняет его в новом файле. (load line -> edit -> write | load -> edit -> write | load line -> edit -> write | ...)

Я довольно новичок в разработке Delphi, и я также прочитал несколько страниц о TStringLists, У моего текстового файла будет много строк (у него может быть 5000 строк), и я не хочу, чтобы моя программа теряла производительность.

Любое предложение? Должен ли я использовать TStringList или один из двух методов, перечисленных мной ранее?


5


источник


Ответы:


5000 линий не много, если строки очень длинные.

Самый простой способ - использовать TStringList, Нет необходимости использовать элемент управления графическим интерфейсом, если пользователь не должен видеть или редактировать контент.

var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(YourFileNameHere);
    for i := 0 to SL.Count - 1 do
    begin
      SL[i] := IntToStr(i) + ' ' + SL[i];
      // Do any other processing
    end;

    SL.SaveToFile(YourFileNameHere);
  finally
    SL.Free;
  end;
end;

Если (как вы говорите в комментарии выше), вам нужно сделать это в TMemo для целей тестирования вы можете сделать это следующим образом:

Memo1.Lines.LoadFromFile(YourFileNameHere);
for i := 0 to Memo1.Lines.Count - 1 do
  Memo1.Lines[i] := IntToStr(i) + ' ' + Memo1.Lines[i];
Memo1.Lines.SaveToFile(YourFileNameHere);

Конечно, самый простой способ сделать это - написать процедуру, принимающую равную TStrings потомок любого рода:

procedure AppendValueToStrings(const SL: TStrings; 
  StartingValue: Integer);
var
  i: Integer;
begin
  Assert(Assigned(SL));  // Make sure a valid TStrings has been passed in
  for i := 0 to SL.Count - 1 do
  begin
    SL[i] := IntToStr(StartingValue) + ' ' + SL[i];
    Inc(StartingValue);
  end;
end; 

Затем вы можете вызвать его одним из них:

SL := TStringList.Create;
try
  SL.LoadFromFile(YourFileNameHere);
  AppendValueToStrings(SL, 10);
  SL.SaveToFile(YourFileNameHere);
finally
  SL.Free;
end;

Memo1.Lines.LoadFromFile(YourFileNameHere);
AppendValueToStrings(Memo1.Lines, 10);
Memo1.Lines.SaveToFile(YourFileNameHere);

8