同样的写入/读取,用静态数组没问题,但动态数组就不行。
Button1, Button2, memo1
================
procedure TForm1.Button1Click(Sender: TObject);
var ax: array of string ;
sx: TfileStream ;
begin
setlength(ax,10);
ax[0]:='agds3255';
ax[1]:='ag34663@@2t6363463463dfhdhy3455';
ax[2]:='gre5';
ax[3]:='agd364346255';
try
sx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenWrite or fmCreate) ;
sx.Write(ax, 40) ;
finally
sx.Free ;
end ;
ax:= Nil ;
end;procedure TForm1.Button2Click(Sender: TObject);
var axx: array of string ;
sxx: TfileStream ;
begin
setlength(axx,10);
try
sxx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenRead) ;
sxx.seek(0, soFromBeginning);
sxx.Read(axx, 40) ;
finally
sxx.Free ;
end ;
memo1.Lines.Text:=axx[0]+'/'+axx[1]+'/'+axx[2] ;
axx:= Nil ;
end;============
现在的问题是:
写入可以运行,但无法确定是否正确写入;
读取出错,'Access violation at address 0069F4FA, Read of address FFFFFFFF'
请各位指教,代码通过,马上给分!谢谢!
Button1, Button2, memo1
================
procedure TForm1.Button1Click(Sender: TObject);
var ax: array of string ;
sx: TfileStream ;
begin
setlength(ax,10);
ax[0]:='agds3255';
ax[1]:='ag34663@@2t6363463463dfhdhy3455';
ax[2]:='gre5';
ax[3]:='agd364346255';
try
sx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenWrite or fmCreate) ;
sx.Write(ax, 40) ;
finally
sx.Free ;
end ;
ax:= Nil ;
end;procedure TForm1.Button2Click(Sender: TObject);
var axx: array of string ;
sxx: TfileStream ;
begin
setlength(axx,10);
try
sxx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenRead) ;
sxx.seek(0, soFromBeginning);
sxx.Read(axx, 40) ;
finally
sxx.Free ;
end ;
memo1.Lines.Text:=axx[0]+'/'+axx[1]+'/'+axx[2] ;
axx:= Nil ;
end;============
现在的问题是:
写入可以运行,但无法确定是否正确写入;
读取出错,'Access violation at address 0069F4FA, Read of address FFFFFFFF'
请各位指教,代码通过,马上给分!谢谢!
sx.seek(0,2);
sx.Write(ax, 40) ;
多重复几次 看看文件的大小 (SIZE)
sx.Write(ax, 40) ;
实际是写入从 ax 的地址开始的40个字节,而实际ax中存放的是相关字符串的指针,所以写入的并不是你要的内容。
你可以取数组长度,然后逐一写入
例如:
procedure TForm1.Button1Click(Sender: TObject);
var ax: array of string;
sx: TfileStream ;
i: Integer;
begin
setlength(ax,10);
ax[0]:='444444444';
ax[1]:='555555555';
ax[2]:='666666666';
ax[3]:='777777777';
try
sx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenWrite or fmCreate) ;
for i := Low(ax) to High(ax) do
sx.Write(PChar(ax[i])^, Length(ax[i]));
finally
sx.Free;
end ;
ax:= Nil;
end;
1》静态数组用sizeof(string)*length(ax)或者sizeof(ax),你用的是Length(ax[i]),Length(ax[i])指的是大小么?sizeof(string)是4,Length(ax[i])是字符串中包含的字符的数量,string可以有上百个字符,大小固定为4,而Length(ax[i])是有几个字符就是几,这让我迷惑,还有,用静态数组写入生成的文件打开是乱码(但写入肯定正确),你的方法生成的文件打开是可辨认的明码,与程序中输入的一致,这也让我迷惑??
2》我已经试验写入完全正确,但读取的还弄不出来,你再指点一下怎么读取。
procedure TForm1.Button1Click(Sender: TObject);
var
ax: array of string[10];
sx: TfileStream ;
i: Integer;
begin
setlength(ax,10);
ax[0]:='444444444';
ax[1]:='555555555';
ax[2]:='666666666';
ax[3]:='777777777';
try
sx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenWrite or fmCreate) ;
for i := Low(ax) to High(ax) do
sx.Write(ax[i], sizeof(ax[i]));
finally
sx.Free;
end ;
ax:= Nil;
end;
procedure TForm1.Button2Click(Sender: TObject);
var axx: array of string[10] ;
sxx: TfileStream ;
i,N:integer;
begin
setlength(axx,10);
try
sxx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenRead) ;
sxx.seek(0, soFromBeginning);
for i := Low(axx) to High(axx) do
sxx.Read(axx[i], Sizeof(axx[i]));
finally
sxx.Free ;
end ;
memo1.Lines.Text:=axx[0]+#13#10+'/'+axx[1]+#13#10+'/'+axx[2]+#13#10+'/'+axx[3] ;
axx:= Nil ;
end;
如果你不用固定长度的String,那数组通过文件流保存的时候就保存的是String的指针,而不是里面的数据!