绝对神奇!!!看看这段,写入文件后读出来竟然不一样(TFileStream)(100分)

  • 主题发起人 !雅龙
  • 开始时间

!雅龙

Unregistered / Unconfirmed
GUEST, unregistred user!
///写入
procedure TForm1.Button1Click(Sender: TObject);
var
F:TFileStream;
hhh:Array of integer;
begin
SetLength(hhh,2);
hhh[1]:=9;
F:=TFileStream.Create('d:/abc.txt', fmCreate);
F.Write(hhh,8);
F.Free;
showmessage(inttostr(hhh[1]));
end;

///读出
procedure TForm1.Button2Click(Sender: TObject);
var
F:TFileStream;
ttt:Array of integer;
begin
SetLength(ttt,2);
F:=TFileStream.Create('d:/abc.txt', fmOpenRead);
F.Read(ttt,8);
F.Free;
// SetLength(ttt,2);
showmessage(inttostr(ttt[1]));
end;
 
不要一次调试就按button1和button2,先按button1,写入文件,然后结束调试;再重新调试,
按button2,就会看到读出来的不是写进去的!

更奇怪的情况:如果一次调试中,先按button1再按button2,那么显示就对了
 
procedure TForm1.Button1Click(Sender: TObject);
var
F:TFileStream;
hhh:Array of integer;
begin
SetLength(hhh,2);
hhh[1]:=9;
F:=TFileStream.Create('d:/abc.txt', fmCreate);
F.Write(hhh[1],9);
F.Free;
showmessage(inttostr(hhh[1]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
F:TFileStream;
ttt:Array of integer;
begin
SetLength(ttt,2);
F:=TFileStream.Create('d:/abc.txt', fmOpenRead);
F.Read(ttt[1],8);
F.Free;
// SetLength(ttt,2);
showmessage(inttostr(ttt[1]));
end;
 
欢迎参与!!!

但这样不符合我的要求。其实这是 动态数组 储存到文件的问题,我要求的是整个数组的
一次性存取。就像静态数组一样。但是动态就不行。。。。
 
这里ttt,跟ttt[1]的概念不一样的;
ttt并不代表一个数组的第一个元素;
你观测一次写入的abc.txt,如果按你的写法,连写入的数据都是不对的
更别说读出来了;
而修改后,观察abc.txt 前面四个字节是09 00 00 00;证明写入是正确的
 
那为什么实现定义好ttt(静态数组)就可以正常???

应该有解决办法吧?
 
动态连续数组的写入
procedure TForm1.Button1Click(Sender: TObject);
var
F:TFileStream;
hhh:Array of integer;
begin
SetLength(hhh,2);
hhh[0]:=8;
hhh[1]:=9;
F:=TFileStream.Create('d:/abc.txt', fmCreate);
F.Write(hhh[0],sizeof(integer)*2);
F.Free;
showmessage(inttostr(hhh[0]));
end;
//读出
procedure TForm1.Button2Click(Sender: TObject);
var
F:TFileStream;
ttt:Array of integer;
begin
SetLength(ttt,2);
F:=TFileStream.Create('d:/abc.txt', fmOpenRead);
F.Read(ttt[0],sizeof(integer)*2);
F.Free;
// SetLength(ttt,2);
showmessage(inttostr(ttt[0]));
end;
 
您的意思是:以ttt[0]为内存起步地址,按照后面的size来读写?

很有创意!我试试看~
 
///写入
procedure TForm1.Button1Click(Sender: TObject);
var
F:TFileStream;
hhh:Array of integer;
begin
SetLength(hhh,2);
hhh[1]:=8;
F:=TFileStream.Create('d:/tmp/abc1.txt', fmCreate);
F.Write(hhh[1],sizeof(integer));
F.Free;
showmessage(inttostr(hhh[1]));
end;

///读出
procedure TForm1.Button2Click(Sender: TObject);
var
F:TFileStream;
ttt:Array of integer;
begin
SetLength(ttt,2);
F:=TFileStream.Create('d:/tmp/abc1.txt', fmOpenRead);
F.Read(ttt[1],sizeof(integer));
F.Free;
showmessage(inttostr(ttt[1]));
end;
 
还有,动态数组下标一般从0开始的;
至于用数组名来代表数组的第一个元素,是C/C++的习惯;pascal中是不行的
 
非常感谢!!交流交流吧:腾讯QQ:4322897
 
接受答案了.
 
顶部