Как сохранить строку в текстовых файлах в Delphi?

Каков самый простой способ создать и сохранить строку в файлах .txt?

Ответ 1

Используйте TStringList.

uses
  Classes, Dialogs; // Classes for TStrings, Dialogs for ShowMessage

var
  Lines: TStrings;
  Line: string;
  FileName: string;
begin
  FileName := 'test.txt';
  Lines := TStringList.Create;
  try
    Lines.Add('First line');
    Lines.Add('Second line');
    Lines.SaveToFile(FileName);
    Lines.LoadFromFile(FileName);
    for Line in Lines do
      ShowMessage(Line);
  finally
    Lines.Free;
  end;
end;

Также SaveToFile и LoadFromFile могут использовать дополнительную кодировку в Delphi 2009 и новее для установки текстовой кодировки (Ansi, UTF-8, UTF-16, UTF-16 big endian).

Ответ 2

Собственно, я предпочитаю это:

var
  Txt: TextFile;
  SomeFloatNumber: Double;
  SomeStringVariable: string;
  Buffer: Array[1..4096] of byte;
begin
  SomeStringVariable := 'Text';
  AssignFile(Txt, 'Some.txt');
  Rewrite(Txt);
  SetTextBuf(Txt, Buffer, SizeOf(Buffer));
  try
    WriteLn(Txt, 'Hello, World.');
    WriteLn(Txt, SomeStringVariable);
    SomeFloatNumber := 3.1415;
    WriteLn(Txt, SomeFloatNumber:0:2); // Will save 3.14
  finally CloseFile(Txt);
  end;
end;

Я считаю это самым простым способом, поскольку для этого кода вам не нужны классы или другие единицы. И он работает для всех версий Delphi, в том числе - если я не ошибаюсь - все версии .NET Delphi...


Я добавил вызов SetTextBuf() в этот пример, что является хорошим трюком для ускорения текстовых файлов в Delphi. Обычно текстовые файлы имеют буфер всего 128 байт. Я стараюсь увеличить этот буфер до кратного 4096 байт. В нескольких случаях я также реализовал свои собственные типы TextFile, позволяя мне использовать эти "консольные" функции для ввода текста в поля memo или даже в другое внешнее приложение! На это место - это пример кода (ZIP), который я написал в 2000 году и только что изменен, чтобы убедиться, что он компилируется с Delphi 2007. Не уверен в более новых Delphi версии, однако. Опять же, этот код уже 10 лет.
Эти функции консоли были стандартом языка Pascal, так как это начало, поэтому я не ожидаю, что они исчезнут в ближайшее время. В будущем тип TtextRec может быть изменен, поэтому я не могу предсказать, будет ли этот код работать в будущем... Некоторые объяснения:

  • WA_TextCustomEdit.AssignCustomEdit позволяет записывать текст в объекты на основе CustomEdit, такие как TMemo.
  • WA_TextDevice.TWATextDevice - это класс, который можно отбросить в форме, которая содержит события, где вы можете что-то сделать с записанными данными.
  • WA_TextLog.AssignLog используется мной для добавления временных меток в каждую строку текста.
  • WA_TextNull.AssignNull - это, в основном, фиктивное текстовое устройство. Он просто отбрасывает все, что вы ему пишете.
  • WA_TextStream.AssignStream записывает текст в любой объект TStream, включая потоки памяти, потоки файлов, потоки TCP/IP и все, что у вас есть.

Код в ссылке лицензируется как CC-BY alt text


О, сервер с ZIP файлом не очень мощный, поэтому он имеет тенденцию к снижению несколько раз в день. Извините.

Ответ 3

Или, если вы используете более старую версию Delphi (которая не имеет метода for line in lines для итерации списка строк):

var i : integer;
begin

...
try
    Lines.Add('First line');
    Lines.Add('Second line');
    Lines.SaveToFile(FileName);
    Lines.LoadFromFile(FileName);
    for i := 0 to Lines.Count -1 do
      ShowMessage(Lines[i]);
  finally
    Lines.Free;
  end;

Ответ 4

Модуль IOUtils, который был представлен в Delphi 2010, предоставляет очень удобные функции для записи/чтения текстовых файлов:

//add the text 'Some text' to the file 'C:\users\documents\test.txt':
TFile.AppendAllText('C:\users\documents\text.txt', 'Some text', TEncoding.ASCII);

Ответ 5

Если вы используете версию Delphi >= 2009, взгляните на класс TStreamWriter.

Он также будет следить за кодированием текстовых файлов и символами новой строки.

Ответ 6

procedure String2File;
var s:ansiString;
begin
    s:='My String';
    with TFileStream.create('c:\myfile.txt',fmCreate) do
    try
      writeBuffer(s[1],length(s));
    finally
      free;
    end;
end;

Уход, необходимый при использовании строк в Юникоде....