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 . |