TP中的文件追加(30分)

  • 主题发起人 主题发起人 博雨
  • 开始时间 开始时间

博雨

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TP6.0(是不是很远古!没办法)编一个文件处理程序.
我想向一个文件中追加一个记录,文件类型不是Text类型,而是 f:file of record 类型,不能用Append追加.
只有先将所有文件内容读到一个相应记录类型的数组中,然后再最后一条记录后加一项,但如果每次都读到数组中后,再从写文件,可能会造成内存不足的错误.
而且如果数组定义不够大,可能造成数据无法追加的后果. 即向如下方法:
type
ss=record
.
.
.
end;
var
zlcs :attay[1..100] of ss;
fzlcs :file of ss;
begin
assign(fzlcs,'aaa.dat');
reset(fzlcs);
i:=1;
while not eof(fzlcs) do
begin
read(fzlcs,zlcs)

i:=i+1;
end;
zlcs[i+1]:=... {追加记录}
close(fzlcs);

.
.
.
assign(fzlcs,'aaa.dat');
rewrite(fzlcs);
i:=1;
while not eof(fzlcs) do
begin
write(fzlcs,zlcs)

i+1;
end;
close(fzlcs);
end;
在DELPHI中这很好解决,但在TP6.0中我就.....
各位大侠帮帮忙.
 
1.在TP6中好象有一个TEmsStream,是使用扩充内存的一个类,他可以使用1M以上空间
你可以把你的数据读入TEmsStream中。
2.你可以新建一个文件将前后数据和插入的数据分别复制到新文件中
然后删除旧文件,将新文件改名。
 
Hexi
只有这种方法吗?
我的意思是能不能想文本文件一样追加.
如果不能,我只有在Delphi里完成类似功能.
现在基本已没人用TP做东西了,我在做课程设计时手头只有TP,只好先用它完成,然后再向Delphi移植.
遇到问题很想得到答案,请大家继续讨论讨论吧.
 
用seek(sizeof(fzlcs))将文件指针移动到最后再写不就行了?
 
用TEmsStream呀。
以后移植到Delphi中只要改为TMemoryStream就可以了。
先把整个文件读入TEmsStream;
对TEmsStream的数据进行修改。
当用户选择存储时将整个TEmsStream中的数据存入文件中。
你查查帮助吧。
我帮你查了下:
type
ss=record
.
.
.
end;
var
EmsStream:TEmsStream
//扩展内存
DosStream:TDosStream
//文件
s:ss;
begin
DosStream:=Init('aaa.dat', fmRead);
EmsStream:=Init(1024,1024*1024);//最大1M 字节
EmsStream.CopyFrom(DosStream, DosStream.GetSize);
DosStream.Done;
EmsStream.Seek(EmsStream.GetSize);
//EmsStream.Seek(Sizeof(S)*n)//定位到第n个记录。
EmsStream.Write(s, sizeof(s);

DosStream:=Init('aaa.dat', fmRead);
EmsStream.Seek(0);
DosStream.CopyFrom(EmsStream, EmsStream.GetSize);
EmsStream.Done;
DosStream.Done;
end;
直接添加:
var
F:File of ss;
s:ss;
begin
Assign(F, 'aaa.dat');
Reset(F);
Seek(F, FileSize(F));
Write(F, s);
close(F);
end;


 
移动文件指针显然不行。
Hexi
是个好主意,我回去试试。
先谢谢各位了。
 
看来目前只有这个办法了。
这里谢过了Hexi。

 
后退
顶部