2024年4月30日发(作者:)

Delphi文本文件读写

Delphi支持三种文件类型:文本文件、记录文件、无类型文件。

文本文件是以行为单位进行读、写的。由于每一行的长度不一定相同,不能计算出给定行在

文件中的确切位置,因而只能顺序地读写。

文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许

的。

文本文件的打开需要两个步骤:1.文件变量与文件名关联;2.初始化读写。

1.文件变量与文件名关联:

AssignFile(VarTxt,FileName);

FileName如果省略路径将默认当前目录。

2.初始化读写有三种方式:

(1)Reset:只读打开,指针移到文件头;

(2)Rewrite:创建新文件并打开,只写;

(3)Append:从尾部追加,指针当然在文件尾。

文件不存在时使用Reset或Append会引发一个I/O异常。

最后用CloseFile关闭文件。

为保持兼容,Delphi也允许用户用Assign建立关联,用Close关闭文件。

--------------------------------------------------------------------------------

//读写示例:

unitUnit1;

interface

usesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

StdCtrls;

typeTForm1=class(TForm)

Memo1:TMemo;

Button1:TButton;

Button2:TButton;

Button3:TButton;

Button4:TButton;

Button5:TButton;

Button6:TButton;

Button7:TButton;

Dialogs,

procedureButton1Click(Sender:TObject);

procedureButton2Click(Sender:TObject);

procedureButton3Click(Sender:TObject);

procedureButton4Click(Sender:TObject);

procedureButton5Click(Sender:TObject);

procedureButton6Click(Sender:TObject);

procedureButton7Click(Sender:TObject);

private{Privatedeclarations}

public{Publicdeclarations}

end;

varForm1:TForm1;

implementation

{$R*.dfm}

var

F:Text;//TextFile和Text是一样的

FileName:string='c:';

//写文件

1Click(Sender:TObject);

begin

AssignFile(F,FileName);

Rewrite(F);//会覆盖已存在的文件

Writeln(F,'第一行');

Writeln(F,'第二行');

CloseFile(F);

end;

//读文件(先执行写文件)

2Click(Sender:TObject);

var

s:string;

begin

AssignFile(F,FileName);

Reset(F);//只读打开

Readln(F,s);//读取

ShowMessage(s);//显示:第一行

Readln(F,s);//继续读取

ShowMessage(s);//显示:第二行

CloseFile(F);

end;

//追加

3Click(Sender:TObject);

begin

AssignFile(F,FileName);

Append(F);//打开准备追加

Writeln(F,'第三行');

Writeln(F,'第四行');

CloseFile(F);

end;

//读取全部(需要Memo帮忙显示)

4Click(Sender:TObject);

var

s:string;

begin

AssignFile(F,FileName);

Reset(F);//只读打开

;

whilenotEof(F)do

begin

Readln(F,s);

(s);

end;

CloseFile(F);

end;

//分列写入

5Click(Sender:TObject);

凑够n的长度

functionAddSpace(s:string;n:Word):string;

begin

whileLength(s)

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);

//这个过程级函数的功能是:用空格把s

address:='贵州省安顺黄果树';

address:=AddSpace(address,16);

Writeln(F,name,address);

name:='王二麻子';

name:=AddSpace(name,8);

address:=AddSpace(address,16);

Writeln(F,name,address);

CloseFile(F);

{写入的结果是:张三山东泰安李四儿贵州省安顺黄果树

区}

end;

//分列读取

6Click(Sender:TObject);

varname:string[8];

address:string[16];

begin

AssignFile(F,FileName);

Reset(F);

;

whilenotEof(F)do

begin

Readln(F,name);

(name);

end;

CloseFile(F);

Reset(F);

whilenotEof(F)do

begin

Readln(F,name,address);

(address);

end;

CloseFile(F);

{读取结果:张三李四儿王二麻子山东泰安

北京市海淀区}

end;

//不同数据类型的写入和读取

7Click(Sender:TObject);

varname: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);

;

(name);

(IntToStr(age));

(DateToStr(birthday));

CloseFile(F);

{读取结果:菜花181989-12-23}

//假如她今天过生日

//其实这样的东西应该用类型文件操作更合适,但如果有这样的文本文件让你读取呢?

end;

end.