如何删除类型文件的一个记录(200分)

  • 主题发起人 主题发起人 sgs125
  • 开始时间 开始时间
S

sgs125

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个类型文件如:
Tperson = Packed Record
name string[20];
Mi:String[2];
end;
我已经将其保存成一个文件(.dat的),我需要删除其中的一个记录,请问如何删除
我给200分
最好有例子
我的email是sgs@fm365.com
 
删除后原来的这部分空间怎么处理?填空格or后面的前移?
 
好像不能删除,我也问过很长时间没人有好答案。
只能另存一个文件,好像麻烦了点。
 
删除后的空间要往前移
 
type
Tperson = Packed Record
name:string[20];
Mi:String[2];
end;
procedure TForm1.Button8Click(Sender: TObject);
var //生成文件
Person:TPerson;
F:File of TPerson;
i:Integer;
begin
AssignFile(F,'Person.txt');
Rewrite(F);
for i:=1 to 100 do
begin
Person.name:='Mike '+IntToStr(i);
Person.Mi:=IntToStr(i mod 2);
Write(F,Person);
end;
CloseFile(F);
end;
procedure TForm1.Button9Click(Sender: TObject);
var
Person:TPerson;
F:File of TPerson;
i:Integer;
begin
AssignFile(F,'Person.txt');
Reset(F);
Caption:=IntToStr(FileSize(F));
for i:=10 to 99 do //删除第10个记录,其后的记录顺序前移
begin
Seek(F,i);
Read(F,Person);
Seek(F,i-1);
Write(F,Person);
end;
Truncate(F)
//截断文件(丢弃最后一个记录)
CloseFile(F);
end;
 
我在加100分请把添加,查找的代码一并给我可以吗
 
type
Tperson = Packed Record
name:string[20];
Mi:String[2];
end;
PersonFile=File of TPerson;
var
PF:PersonFile;
function FindRecord(Name:String):Integer;
var // return -1 if failed
i:Integer;
Person:TPerson;
begin
Result:=-1;
for i:=0 to FileSize(PF)-1 do
begin
Seek(PF,i);
Read(PF,Person);
if Person.name=Name then
begin
Result:=i;
exit;
end;
end;
end;
function InsertRecord(Loc:Integer;Person:TPerson):Boolean;
var //Loc=0 -> add before head Loc=FileSize -> add after tail
i:Integer;
P:TPerson;
begin
Result:=false;
if (Loc>FileSize(PF)) or (Loc<0) then
exit;
for i:=FileSize(PF)-1 downto Loc do
begin
Seek(PF,i);
Read(PF,P);
Seek(PF,i+1);
Write(PF,P);
end;
Seek(PF,Loc);
Write(PF,Person);
Result:=true;
end;
function DeleteRecord(Loc:Integer):Boolean;
var // Loc = 0..FileSize-1
i:Integer;
Person:TPerson;
begin
Result:=false;
if (Loc>=FileSize(PF)) or (Loc<0) then
exit;
for i:=Loc+1 to FileSize(PF)-1 do
begin
Seek(PF,i);
Read(PF,Person);
Seek(PF,i-1);
Write(PF,Person);
end;
Truncate(PF);
Result:=true;
end;
procedure TForm1.Button8Click(Sender: TObject);
var
Person:TPerson;
i:Integer;
begin
AssignFile(PF,'Person.txt');
Rewrite(PF);
for i:=1 to 100 do
begin
Person.name:='Mike '+IntToStr(i);
Person.Mi:=IntToStr(i mod 2);
Write(PF,Person);
end;
Person.name:='Add Name';
Person.Mi:='A';
InsertRecord(FindRecord('Mike 1'),Person);
Person.Mi:='B';
InsertRecord(FindRecord('Mike 25'),Person);
DeleteRecord(FindRecord('Mike 90'));
FillChar(Person.name,12,0);
Person.name:='HaHa!';
Person.Mi:='**';
InsertRecord(FileSize(PF),Person);
CloseFile(PF);
end;

OK!
 
接受答案了.
 
后退
顶部