lazarus/delphi (pascal) — запись в txt файл без перезаписи в следующий раз

Я использую Lazarus, и я хотел сохранить в txt-файл информацию, когда программа закрыта. Но каждый раз, когда я снова открываю программу, она перезаписывает то, что было раньше в текстовом файле. Было бы нормально как писать на следующую строку, так и даже создавать каждый раз другой текстовый файл. Вот что у меня есть:

var
  ...
  s: TStringList;

  s:= TStringList.Create;
  s.Add(datetostr(now));
  s.SaveToFile(datetostr(now)+'.txt');
  s.Free;

но мне выдает ошибку


person Thomas Simon Mattia    schedule 23.06.2016    source источник
comment
Открыть файловый поток, перейти в конец, сохранить в поток   -  person David Heffernan    schedule 23.06.2016
comment
Если у вас есть ошибка, вы можете увидеть, что это такое. Мы не можем. Нам угадывать? Вы прочитали сообщение об ошибке? Возможно, дата в виде строки имеет разделители пути. Зачем нам гадать.   -  person David Heffernan    schedule 23.06.2016
comment
Я проверяю все сообщения об ошибках компилятора, но не могу найти сообщение об ошибке.   -  person Marco van de Voort    schedule 23.06.2016
comment
В зависимости от вашей локали в вашем результате DateToStr могут быть косые черты, что сделает его недействительным в качестве имени файла. Вместо этого используйте FormatDateTime и убедитесь, что результатом является правильное имя файла. Также используйте часы, минуты и секунды в вашем формате, чтобы вы могли запускать несколько раз в день.   -  person Martin Maat    schedule 23.06.2016


Ответы (2)


Все, что вам нужно сделать, это открыть файл в режиме добавления, а затем добавить свой текст. Он поместит новые данные в конец файла:

  AssignFile(tfOut, C_FNAME);

  try
    // Open for append, write and close.
    append(tfOut);

    writeln(tfOut, 'New data for text file');
    writeln(tfOut, 'New informtion should be at the end of the file.');

    CloseFile(tfOut);

  except
    on E: EInOutError do
     writeln('File error. Elaboration: ', E.Message);
  end;
person JohnP    schedule 23.06.2016
comment
WriteLn в предложении exclude подойдет для консольного приложения. Если приложение оператора является приложением VCL, это не так. - person Martin Maat; 23.06.2016

Другой метод использования tstringlist:

с: TStringList;

s:= TStringList.Create;

s.loadfromfile('myfile.name');

s.Add(datetostr(сейчас));

(или s.text := s.text + lineending + datetostr(сейчас))

s.SaveToFile('myfile.name');

с.Бесплатно;

person juus    schedule 11.07.2016