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: stringn: 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 := 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.
下面简单地说一下:1、首先定义一个文件变量。
如果是文本方式:var F: TextFile
如果是二进制方式:var DataFile: file
2、打开文件,先用AssignFile指定文件名,然后用Reset来打开。如:
AssignFile(F, 'test.txt')
Reset(F)
3、文本文件的读写方法:然后使用Read和Readln读文件。Read相当于VB的Input #,而Readln相当于Line Input #。写文件使用Write和Writeln,相当于Print #语句。
二进制文件的读写方法:然后使用BlockRead读文件。BlockRead相当于VB的Get。写文件使用BlockWrite,相当于Put语句。
4、使用CloseFile关闭文件。
{ 方法二:使用内存块进行读写 }
procedure FileCopy(const FromFile, ToFile: string)
var
FromF, ToF: file
NumRead, NumWritten: Word
Buf: array[1..2048] of Char
begin
AssignFile(FromF, FromFile)
Reset(FromF, 1)
AssignFile(ToF, ToFile)
Rewrite(ToF, 1)
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead)
BlockWrite(ToF, Buf, NumRead, NumWritten)
until (NumRead = 0) or (NumWritten <>NumRead)
CloseFile(FromF)
CloseFile(ToF)
end
typeTFileStruct = record
name: string[20]
age: Integer
salary: Real
end
procedure TForm1.Button1Click(Sender: TObject)
var
tf: File of TFileStruct
tfsTmp: TFileStruct
begin
tfsTmp.name:= 'Hello World'
tfsTmp.age:= 18
tfsTmp.salary:= 1000.00
AssignFile(tf, '123.txt')
Rewrite(tf)
Write(tf, tfsTmp)
CloseFile(tf)
end
procedure TForm1.Button2Click(Sender: TObject)
var
tf: file of TFileStruct
tfsTmp: TFileStruct
begin
AssignFile(tf, '123.txt')
Reset(tf)
Read(tf, tfsTmp)
CloseFile(tf)
Memo1.Lines.Add(Format('%s', [tfsTmp.name]))
Memo1.Lines.Add(Format('%d', [tfsTmp.age]))
Memo1.Lines.Add(Format('%m', [tfsTmp.salary]))
end
按照你说的方法测试了一下,read函数不应该有问题,如上所示,是不是其它地方引起的?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)