当前位置:主页>仓库管理软件> 列表

读记录型文件出现的意外结果 找傻瓜进销存

销售管理软件版1楼: 记录类型:
Type
tperson = Packed Record
name: String[40];
birthday: TDate;
End;
创建文件:
Procedure TForm1.Button3Click(Sender: TObject);
Var
man: tperson;
mydata: File Of tperson;
Begin
AssignFile(mydata, ''c:\data.dat'');
If FileExists(''c:\data.dat'') Then
Reset(mydata)
Else
Rewrite(mydata);
man.name := ''口若悬河'';
man.birthday := strtodate(''1997-10-01'');
seek(mydata, sizeof(mydata));
Try
write(mydata, man);
Finally
CloseFile(mydata);
End

End;

读出刚写进的记录(该文件仅一条记录)
Procedure TForm1.Button4Click(Sender: TObject);
Var
man: tperson;
mydata: File Of tperson;
i: Integer;
Begin
AssignFile(mydata, ''c:\data.dat'');
If FileExists(''c:\data.dat'') Then
Reset(mydata)
Else
Raise Exception.Create(''文件不存在'');
Reset(mydata);
Memo1.Lines.Clear;
Try

i := 1;
While Not Eof(mydata) Do
Begin
Read(mydata, man);
Memo1.Lines.Add(''*****'' + IntToStr(i) + ''**********'');
Memo1.Lines.Add(man.name);
Memo1.Lines.Add(DateToStr(man.birthday));
i := i + 1;
End;
Finally
CloseFile(mydata);
End;

End;

读出结果成了330条记录,时间也不是原写入的时间
.............
............
.
.
.
1899-12-30
*****326**********

1899-12-30
*****327**********

1899-12-30
*****328**********

1899-12-30
*****329**********

1899-12-30
*****330**********

1899-12-30
*****331**********

1899-12-30
*****332**********

1899-12-30
*****333**********
口若悬河 //从这里开始才是原写入的内容,上面的都不是
1997-10-01

2楼: 用readln試試 如傻瓜进销存

3楼: Readln(mydata, man);
======================
错误提示


incompatible type

4楼: 问题应该出在这里
seek(mydata, sizeof(mydata));

5楼: seek后先empty mydata一下

6楼: 果然如二位高人所言,本人写错了代码
seek(mydata, sizeof(mydata));//取得的是变量的大小
改为:
seek(mydata, filesize(mydata)); //这样才是文件的大小
ok

可是系统总警告:
unsafe type ''mydata:file of tperson''
是何原因?

销售管理软件版7楼: 我这里没有警告,可能和你的编译设置有关系

8楼: 多人接受答案了。