前言:
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
interfaceuses 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.
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
interfaceuses 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.