同样的写入/读取,用静态数组没问题,但动态数组就不行。
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'
请各位指教,代码通过,马上给分!谢谢!

解决方案 »

  1.   

    sx.Write(ax, 40) ;为什么只要40呢   而不用SIZEOF????写入可以运行,但无法确定是否正确写入;//sx:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'555.dat',fmOpenWrite) ;
    sx.seek(0,2);
    sx.Write(ax, 40) ;
    多重复几次  看看文件的大小 (SIZE)
      

  2.   

    可以把40分别换成 sizeof(string)*length(ax) 和 sizeof(string)*length(axx)
      

  3.   

    这样写入是不行的
    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;
      

  4.   

    谢谢imustworkhard,我还有几点不明白:
    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》我已经试验写入完全正确,但读取的还弄不出来,你再指点一下怎么读取。
      

  5.   

    //测试过没问题
    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;
      

  6.   

    yanghuafeng(锋),你好,你的方法有问题,顶多只能读出axx[0]。
      

  7.   

    不会吧,在我的机子上axx[0]、axx[1]、axx[2]、axx[3]全能显示出来啊
      

  8.   

    yanghuafeng(锋),你好,我弄错了,你的能运行,但是全部是固定长度的字符串,这样的话还不如用静态数组好。不知我理解有无错,请指教。
      

  9.   

    固定长度的你可以动态地改变里面的内容啊(静态的肯定不能这样),如果不够长你加长一点就行了。
    如果你不用固定长度的String,那数组通过文件流保存的时候就保存的是String的指针,而不是里面的数据!
      

  10.   

    我先给分啦,请imustworkhard(一切为了生存)把读取的代码发上来。