文本文件以行为单位进行读写操作,只能顺序读写,读写不能同时进行。
通过调用 Append 过程可以打开一个已经存在的文本文件并可在文件末尾添加文本。格式:
procedure Append(var F: TextFile);
其中:F 为文本文件变量,且必须使用 AssignFile 与文件建立关联。
如果文件不存在则产生错误;如果文件已经打开则先关闭然后再打开。
打开文件后,当前文件的位置在文件的末尾。如果 F 为空,则与标准输出文件建立关联。
当文本文件通过 Reset 过程打开以读方式打开后,就可以读取文件内容。读取文本文件可以使用 Read 、Readln 过程来完成。
1.Read
格式:
procedure Read([var F: TextFile;] v1 [, v2, v3, ..., vn]);
该过程可以从文本文件中读取字符串、字符、数值等。其中:
当数据类型为字符串或字符型时,Read 过程按照定义的长度读取字符。
当数据类型为整型或实型时,Read 过程以空格为分隔符,如果数值中出现逗号、分号或其他字符时产生异常。
2.Readln
格式:
procedure Readln([var F: TextFile;] v1 [, v2, v3, ..., vn]);
该过程可以从文本文件中读取字符串、字符、数值等,直到一行结束。
当使用 Rewrite 或 Append 过程打开一个文本文件后,就可以使用 Write 或 Writeln 进行数据写入。
1.Write
格式:
procedure Write([var F: TextFile;] p1 [, p2, p3, ..., pn])
该过程向文件中写入数据。
其中:
F - 文本文件变量;
p1,p2,... - 存放写入的数据,可以是字符串型、字符型、整型或实型。
2.Writeln
格式:
procedure Writeln([var F: TextFile;] p1 [, p2, p3, ..., pn])
该过程向文件中写入一行数据,并在末尾处自动输入回车换行符。
procedure AssignPrn(var F: TextFile);
function Eoln(var F: TextFile): Boolean;
procedure Flush(var F: TextFile);
对于以输入(Rewrite 或 Append)方式打开的文件缓冲区,以确保所有写入文件的内容都被写入到外部文件。
function SeekEof(var F: TextFile): Boolean;
function SeekEoln(var F: TextFile): Boolean;
procedure SetTextBuf(var F: TextFile, var Buf; Size: Integer);
示例:编写一个简单的文件编辑器,界面如下图:
代码如下:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ExtDlgs;
type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
SaveTextFileDialog1: TSaveTextFileDialog;
OpenTextFileDialog1: TOpenTextFileDialog;
procedure Memo1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
procedure CheckSaveFile;
procedure SaveFileWithDialog;
procedure SaveFile;
public
{ Public declarations }
end;
var
Form1: TForm1;
F: TextFile;
FileName: String;
SaveState: Boolean;
implementation
{$R *.dfm}
procedure TForm1.CheckSaveFile;
var
ret: Word;
begin
if (not SaveState) and (Length(Memo1.Text) > 0) then
begin
if FileName <> '' then
SaveFile
else
begin
ret := MessageDlg('保存文件吗?', mtConfirmation, [mbOk, mbCancel], 0);
if ret = mrOk then
begin
if FileName = '' then
begin
SaveFileWithDialog;
end;
end;
end;
end;
end;
procedure TForm1.SaveFileWithDialog;
begin
if SaveTextFileDialog1.Execute then
begin
FileName := SaveTextFileDialog1.FileName;
SaveFile;
SaveState := true;
end;
end;
procedure TForm1.SaveFile;
var
i: Integer;
begin
AssignFile(F, FileName);
Rewrite(F);
for i := 0 to Memo1.Lines.Count do
Writeln(F, Utf8encode(Memo1.Lines.Strings[i]));
CloseFile(F);
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
// Memo 内容发生变化时,将文件的保存状态设置为 fasle
SaveState := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ret: Word;
begin
// 新建按钮
CheckSaveFile;
FileName := '';
SaveState := false;
Memo1.Text := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
var
line: String;
begin
// 打开按钮
CheckSaveFile;
if OpenTextFileDialog1.Execute then
begin
FileName := OpenTextFileDialog1.FileName;
AssignFile(F, FileName);
Reset(F);
Memo1.Text := '';
while not Eof(F) do
begin
Readln(F, line);
Memo1.Lines.Add(line);
end;
CloseFile(F);
SaveState := true;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
// 保存按钮
if FileName = '' then
SaveFileWithDialog
else
SaveFile;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
// 另存为按钮
SaveFileWithDialog;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
// 退出按钮
CheckSaveFile;
Close;
end;
end.
上一篇
已是最后文章