把文件中的数据读到 一个记录类型的变量中?! (150分)

  • 主题发起人 主题发起人 fossil
  • 开始时间 开始时间
F

fossil

Unregistered / Unconfirmed
GUEST, unregistred user!
把文件中的数据读到 一个记录类型的变量中:
文件中的数据是在C++中的结构体,把结构体中的数据以*byte(NH_PORTSTRUCT),byte流的形式写到文件里
typedef struct {
BYTE DGHead;
int BufLength;
} NH_PORTSTRUCT;
我要读到跟 NH_PORTSTRUCT结构类型一样记录类型中
type
NH_PORTSTRUCT = record
DGHead: Byte;
BufLength: Integer;
end;
PNH_PORTSTRUCT = ^NH_PORTSTRUCT;
应该怎么做??
我做的:
New(temp);
f:= TMemoryStream.Create;
f.LoadFromFile ('D:/temp/写备份文件/PortConfig.dat');
f.Seek (0, soFromBeginning);
f.Write (temp,18);
a:= temp^.RPortNo;
D:= temp^.DGHead;
showmessage(inttostr(a));//数据不对!!!!!!!!!!!!!1
f.Free;
Dispose(temp);
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=881917
 
f.Write (temp1,18);
这句有点问题吧?
我想你要分直接用16进制编辑器去分析一下.DAT文件,仍后按数据文件的实际构成
来确定怎样读数据,而不要主观的依据C++和DELPHI的数据类型来读,这样很不保险的!
 
我确定过了
文件里面是 结构体类型的数据存成了BYTE流,每个结构体数据为5 位!
 
记录声明:
type
Student = record
FirstName, LastName: string[20];
PhoneNumber: string[15];
PostCode: Integer;
Birthday: TDate;
end;
StudentList = file of Student;

写入:
procedure TForm1.Button1Click(Sender: TObject);
var
sss: TFileStream;
s: Student;
begin
//...此处判断文件是否存在,如果不存在则建立它...
sss := TFileStream.Create('c:/a.dat', fmOpenWrite);
try
sss.Seek(0, soFromEnd);//新增
{ sss.Seek(0, soFromBeginning);//覆盖则用此方法}
s.FirstName := 'FirstName';
s.LastName := 'LastName';
s.PhoneNumber := '123456';
s.PostCode := 123456;
s.Birthday := Date;
sss.Write(s, sizeof(s));
s.FirstName := '111FirstName';
s.LastName := '111LastName';
s.PhoneNumber := '111123456';
s.PostCode := 111123456;
s.Birthday := Date;
sss.Write(s, sizeof(s));
finally
sss.Free;
end;
end;

读取
procedure TForm1.Button2Click(Sender: TObject);
var
sss: TFileStream;
s: Student;
numread: Integer;
begin
sss := TFileStream.Create('c:/a.dat', fmOpenRead);
try
while True do
begin
numread := sss.Read(s, sizeof(s));
if numread sizeof(s) then break;
showmessage(s.firstname + #13 + s.LastName + #13 +
s.PhoneNumber +#13+
inttostr(s.PostCode)+#13+
datetostr(s.birthday));

end;
finally
sss.Free;
end;
end;
 
楼上的好心人,我要的不是这个啊
已经有C++写好的结构体类型,可是用强制转换类型*byte(结构体名称)转换成BYTE流了,
在DELPHI里,我怎么能把这个流在读到同样结构的记录类型中
 
你把代码贴完整,或者把你的代码以及文件寄到
<a href="mailto:yuan-fan@21cn.com">yuan-fan@21cn.com</a>
我来试试。
 
把你的号告诉我吧!我们好交流一些。
 
type
NH_PORTSTRUCT =record
DGHead: Byte;
BufLength: Integer;
RPortNo: Integer;
RFlag: Byte;
WPortNo: Integer;
WFlag: Integer;
end;
PNH_PORTSTRUCT =^NH_PORTSTRUCT;

var
f: TmemoryStream;
l:Byte;
temp: PNH_PORTSTRUCT;
tempsize:Integer;
begin
tempsize:=SizeOf(temp^);
temp:=AllocMem(tempsize);
f:=TMemoryStream.Create;
f.LoadFromFile('PortConfig.dat');
f.Position:=0;
f.ReadBuffer(temp^,tempsize);
l:=temp.DGHead;
showmessage(IntToStr(l));
f.Free;
FreeMem(temp);


你的代码里:
NH_PORTSTRUCT =3D record <--3d record是通不过的,不允许有空格。
New(temp); <--这样也可以。
f.Write (temp,18); <--我猜想你是要读数据而不是要写数据,对不对?因为这时候
temp在内存中的数据是不定的。
<--因为temp只是一个指针而read、readbuffer、write、write均
是要求一段缓冲区所以应该为temp^——temp指针指向的缓冲区。

其它的数据读取是一样的,我就没有贴出来。
按你的数据,得到的是10。

 
多人接受答案了。
 
后退
顶部