如何在Delphi中将字符串保存到文本文件中?

How to save string into text files in Delphi?

创建字符串并将其保存到.txt文件中最简单的方法是什么?


使用TStringList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;

另外,SaveToFileLoadFromFile可以在Delphi2009和更新版本中采用额外的编码来设置文本编码(ansi、utf-8、utf-16、utf-16 big endian)。


Delphi2010中引入的ioutils单元为编写/读取文本文件提供了一些非常方便的功能:

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


实际上,我更喜欢这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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版本,包括所有Delphi的.NET版本…

我在这个例子中添加了一个对setextbuf()的调用,这是一个很好的技巧,可以大大提高Delphi中文本文件的速度。通常,文本文件的缓冲区只有128个字节。我倾向于将这个缓冲区增加到4096字节的倍数。在一些情况下,我还实现了自己的文本文件类型,允许我使用这些"控制台"功能将文本写入备忘录字段,甚至写入另一个外部应用程序!在这个位置有一些我在2000年编写的示例代码(zip),只是进行了修改,以确保它能与Delphi2007一起编译。不过,不确定新的Delphi版本。同样,这段代码已经有10年的历史了。
自从Pascal语言开始以来,这些控制台功能一直是Pascal语言的标准,因此我不希望它们很快消失。但是,TTextrec类型可能在将来被修改,因此我无法预测此代码是否在将来工作…一些解释:

  • wa text customedit.assigncustomedit允许将文本写入基于customedit的对象,如tmemo。
  • wautextdevice.twatextdevice是一个可以放到表单上的类,其中包含一些事件,您可以在其中对写入的数据执行某些操作。
  • wa textlog.assignlog被我用来向每行文本添加时间戳。
  • wa_textnull.assignnull基本上是一个虚拟文本设备。它只是丢弃你给它写的任何东西。
  • wa textstream.assignstream将文本写入任何tstream对象,包括内存流、文件流、TCP/IP流以及您拥有的其他内容。

链接中的代码在此由alt text授权为CC-

哦,有zip文件的服务器不是很强大,所以它每天都会停机几次。很抱歉。


或者,如果您使用的是旧版本的Delphi(它没有迭代字符串列表的for line in lines方法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;


1
2
3
4
5
6
7
8
9
10
11
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;

使用Unicode字符串时需要注意….


如果您使用的是Delphi版本>=2009,请看一下TStreamWriter类。

它还将处理文本文件编码和换行符。