如何正确读取自己写入格式的文件并操作?急急

kkk2000 2000-10-19 04:49:00
我自己定义了一个MyRecord,其中包括:一个String变量和一个integer变量。然后声名一个MyRecord的变量datarec,并将datarec中的各域复值后我用filewite(filehandle,datarec,sizeof(datarec))将其写入文件中。在程序中我是多次的调用此函数并写放数据到指定的同一文件中。我用Debug查看过生成的文件数据已经按一定的格式写入了文件。现在的问题是我想将文件中的数据一块一块的读出,并按原来的格式存入Myrecord变量或是指针中。我应该怎样做。我用fileread(filehandle,buffer^,sizefo(datarec));下一步我应该如何做请大侠帮助这个问题已经困扰我一天了我的头都大了。
...全文
214 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkk2000 2000-10-23
  • 打赏
  • 举报
回复
感谢大家的帮助,现在问题已经圆满解决了。感谢PoolD的提醒。特别感谢johnpei不惜笔墨的指导。
猛禽 2000-10-20
  • 打赏
  • 举报
回复
PoolID说得对,用TFileStream/TMemoryStream要方便得多,但在DELPHI中用String其实也是可以的,PASCAL的串与C的串是不同的。
lituo 2000-10-20
  • 打赏
  • 举报
回复
int := TMyRecord(buffer).int;
string := TMyRecord(buffer).string;
lituo 2000-10-20
  • 打赏
  • 举报
回复

TMyRecord(Buffer).aaaa
TMyRecord(Buffer).bbbb
.....
kkk2000 2000-10-20
  • 打赏
  • 举报
回复
谢谢,PoolD,我的结构中确实用了sttring,现在我已经改为array[1..100] of char.
johnpei 2000-10-20
  • 打赏
  • 举报
回复


不用困扰。记住一点,不要向文件中写入有string成员的结构变量,如果要写入的话,最好指定STRING的长度,所以,你的结构做如下调整:
type
MyRecord=record
MyS : String[255-1];//当然长度根据实际而定
MyI : Inetger ;
end ;

下面给你作了一个读写的例子,希望对你有所参考:
procedure TForm1.Button3Click(Sender: TObject);
Var
I : Integer ;
PP: MyRecord ;
begin
HFile := FileOpen('C:\temp\FileName.txt', fmOpenReadWrite);
if HFile <= 0 then
HFile := FileCreate('C:\temp\FileName.txt');
for i := 0 to 100-1 do
begin
PP.II := i ;
PP.ss := IntToStr(i) ;
FileWrite(HFile,PP,Sizeof(PP))
end ;
CloseHandle(HFile) ;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
I : Integer ;
P : Array[0..100] of MyRecord ; ;
pp: MyRecord ; //中间变量
begin
HFile := FileOpen('C:\FileName.txt', fmOpenRead);
for i := 0 to 100-1 do
begin
FileRead(HFile,PP,Sizeof(PP)) ;
P[i]:= pp ;
end ;
CloseHandle(HFile) ;
end;

一般读取时,并不需要定义一个BUFFER,定义一个临时的中间结构变量就行了,依次读出就可以了,当然还可以一次读出;如
FileRead(HFile,P,Sizeof(P)) ;
好了,就到这里吧!


johnpei 2000-10-20
  • 打赏
  • 举报
回复
不用困扰。记住一点,不要向文件中写入有string成员的结构变量,如果要写入的话,最好指定STRING的长度,所以,你的结构做如下调整:
type
MyRecord=record
MyS : String[255-1];//当然长度根据实际而定
MyI : Inetger ;
end ;

下面给你作了一个读写的例子,希望对你有所参考:
procedure TForm1.Button3Click(Sender: TObject);
Var
I : Integer ;
PP: MyRecord ;
begin
HFile := FileOpen('C:\temp\FileName.txt', fmOpenReadWrite);
if HFile <= 0 then
HFile := FileCreate('C:\temp\FileName.txt');
for i := 0 to 100-1 do
begin
PP.II := i ;
PP.ss := IntToStr(i) ;
FileWrite(HFile,PP,Sizeof(PP))
end ;
CloseHandle(HFile) ;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
I : Integer ;
P : Array[0..100] of MyRecord ; ;
pp: MyRecord ; //中间变量
begin
HFile := FileOpen('C:\FileName.txt', fmOpenRead);
for i := 0 to 100-1 do
begin
FileRead(HFile,PP,Sizeof(PP)) ;
P[i]:= pp ;
end ;
CloseHandle(HFile) ;
end;
一般读取时,并不需要定义一个BUFFER,定义一个临时的中间结构变量就行了,依次读出就可以了,当然还可以一次读出;如 FileRead(HFile,P,Sizeof(P)) ;
好了,就到这里吧!
PoolD 2000-10-19
  • 打赏
  • 举报
回复
以下只是我个人的观点:
1. 用TFileStream或TMemoryStream会比较方便。
2. 如果读写文件的话,最好不要在结构中用string。
猛禽 2000-10-19
  • 打赏
  • 举报
回复
定义一个指针:Type PMyRecord = ^MyRecord;
Var p : PMyRecord;
p := PMyRecord( buffer );
datarec := p^; // 取一个
Inc( p ); // 下一个
大概如此,我没有Delphi没法试,你试试,有问题再问。
Lionheart 2000-10-19
  • 打赏
  • 举报
回复
No, you needn't fileread, you can assign a file to a variant, and use the read mothed directly.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧