
Delphi 支持三种文件类型: 文本文件、记录文件、无类型文件。 |
文本文件是以行为单位进行读、写的。由于每一行的长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。 |
文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。 |
文本文件的打开需要两个步骤:1.文件变量与文件名关联;2.初始化读写。 |
1.文件变量与文件名关联: |
AssignFile(VarTxt, FileName); |
FileName 如果省略路径将默认当前目录。 |
2.初始化读写有三种方式: |
(1) Reset: 只读打开, 指针移到文件头; |
(2) Rewrite: 创建新文件并打开, 只写; |
(3) Append: 从尾部追加, 指针当然在文件尾。 |
文件不存在时使用 Reset 或 Append 会引发一个I/O异常。 |
最后用 CloseFile 关闭文件。 |
为保持兼容,Delphi 也允许用户用 Assign 建立关联, 用 Close 关闭文件。 |
-------------------------------------------------------------------------------- |
//读写示例: |
unit Unit1; |
interface |
uses |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
Dialogs, StdCtrls; |
type |
TForm1 = class(TForm) |
Memo1: TMemo; |
Button1: TButton; |
Button2: TButton; |
Button3: TButton; |
Button4: TButton; |
Button5: TButton; |
Button6: TButton; |
Button7: TButton; |
procedure Button1Click(Sender: TObject); |
procedure Button2Click(Sender: TObject); |
procedure Button3Click(Sender: TObject); |
procedure Button4Click(Sender: TObject); |
procedure Button5Click(Sender: TObject); |
procedure Button6Click(Sender: TObject); |
procedure Button7Click(Sender: TObject); |
private |
{ Private declarations } |
public |
{ Public declarations } |
end; |
var |
Form1: TForm1; |
implementation |
{$R *.dfm} |
var |
F: Text; //TextFile 和 Text 是一样的 |
FileName: string = 'c:\temp\test.txt'; |
//写文件 |
procedure TForm1.Button1Click(Sender: TObject); |
begin |
AssignFile(F,FileName); |
Rewrite(F); //会覆盖已存在的文件 |
Writeln(F, '第一行'); |
Writeln(F, '第二行'); |
CloseFile(F); |
end; |
//读文件(先执行写文件) |
procedure TForm1.Button2Click(Sender: TObject); |
var |
s: string; |
begin |
AssignFile(F,FileName); |
Reset(F); //只读打开 |
Readln(F, s); //读取 |
ShowMessage(s); //显示: 第一行 |
Readln(F, s); //继续读取 |
ShowMessage(s); //显示: 第二行 |
CloseFile(F); |
end; |
//追加 |
procedure TForm1.Button3Click(Sender: TObject); |
begin |
AssignFile(F,FileName); |
Append(F); //打开准备追加 |
Writeln(F, '第三行'); |
Writeln(F, '第四行'); |
CloseFile(F); |
end; |
//读取全部(需要Memo帮忙显示) |
procedure TForm1.Button4Click(Sender: TObject); |
var |
s: string; |
begin |
AssignFile(F,FileName); |
Reset(F); //只读打开 |
Memo1.Clear; |
while not Eof(F) do |
begin |
Readln(F, s); |
Memo1.Lines.Add(s); |
end; |
CloseFile(F); |
end; |
//分列写入 |
procedure TForm1.Button5Click(Sender: TObject); |
//这个过程级函数的功能是: 用空格把 s 凑够 n 的长度 |
function AddSpace(s: string; n: Word): string; |
begin |
while Length(s) < n do |
begin |
s := s + ' '; |
end; |
Result := s; |
end; |
var |
name: string[8]; |
address: string[16]; |
begin |
AssignFile(F, FileName); |
Rewrite(F); |
name := '张三'; |
name := AddSpace(name,8); |
address := '山东泰安'; |
address := AddSpace(address,16); |
Writeln(F, name, address); |
name := '李四儿'; |
name := AddSpace(name,8); |
address := '贵州省安顺黄果树'; |
address := AddSpace(address,16); |
Writeln(F, name, address); |
name := '王二麻子'; |
name := AddSpace(name,8); |
address := '北京市海淀区'; |
address := AddSpace(address,16); |
Writeln(F, name, address); |
CloseFile(F); |
{写入的结果是: |
张三 山东泰安 |
李四儿 贵州省安顺黄果树 |
王二麻子北京市海淀区 |
} |
end; |
//分列读取 |
procedure TForm1.Button6Click(Sender: TObject); |
var |
name: string[8]; |
address: string[16]; |
begin |
AssignFile(F, FileName); |
Reset(F); |
Memo1.Clear; |
while not Eof(F) do |
begin |
Readln(F, name); |
Memo1.Lines.Add(name); |
end; |
CloseFile(F); |
Reset(F); |
while not Eof(F) do |
begin |
Readln(F, name, address); |
Memo1.Lines.Add(address); |
end; |
CloseFile(F); |
{读取结果: |
张三 |
李四儿 |
王二麻子 |
山东泰安 |
贵州省安顺黄果树 |
北京市海淀区 |
} |
end; |
//不同数据类型的写入和读取 |
procedure TForm1.Button7Click(Sender: TObject); |
var |
name: string[6]; |
age: Word; |
birthday: TDate; |
begin |
AssignFile(F,FileName); |
Rewrite(F); |
name := '菜花 '; //加两个空格凑够6个字符 |
age := 18; |
birthday := StrToDate(DateToStr(Now-18*365)); //假如她今天过生日 |
Writeln(F,name,age,birthday); |
CloseFile(F); |
Reset(F); |
Readln(F,name,age,birthday); |
Memo1.Clear; |
Memo1.Lines.Add(name); |
Memo1.Lines.Add(IntToStr(age)); |
Memo1.Lines.Add(DateToStr(birthday)); |
CloseFile(F); |
{读取结果: |
菜花 |
18 |
1989-12-23 |
} |
//其实这样的东西应该用类型文件操作更合适, 但如果有这样的文本文件让你读取呢? |
end; |
end. |



