在窗口上有两个按钮,一个用来生成一个二进制文件,一个用来读取二进制文件的内容。
为什么总是在读取时报错呢?
procedure TF_DatFile.BitBtn1Click(Sender: TObject);
var
  FS: TStream;  
begin
  FS:=TFileStream.Create('c:\1.dat', fmCreate or fmOpenWrite);
  try
    FS.Write('**TI',4*Sizeof(char));    
  finally
    FS.Free;
  end;
end;procedure TF_DatFile.BitBtn2Click(Sender: TObject);
var
  FS: TStream;
  Str:string;
begin
  FS:=TFileStream.Create('c:\1.dat', fmOpenRead);
  try
    FS.Read(Str,4*sizeof(char));
    showmessage(str);
  finally
    FS.Free;
  end;end;
在读取按钮点取时总是报告“Access violation at address 00404364.Read of address 49542a22.”
请问这是怎么回事?

解决方案 »

  1.   

    procedure TF_DatFile.BitBtn2Click(Sender: TObject);
    var
      FS: TStream;   //------>改为 FS:TFileStream;
      Str:string;
    begin
      FS:=TFileStream.Create('c:\1.dat', fmOpenRead);
      try
        FS.Read(Str,4*sizeof(char));
        showmessage(str);
      finally
        FS.Free;
      end;
      

  2.   

    这样试试
    procedure TF_DatFile.BitBtn2Click(Sender: TObject);
    var
      FS: TStream;
      Str: PChar;//
    begin
      FS:=TFileStream.Create('c:\1.dat', fmOpenRead);
      GetMem(Str, 4*sizeof(char))
      try    
        FS.Read(Str,4*sizeof(char));
        showmessage(str);
      finally
        FreeMem(Str);
        FS.Free;
      end;end;
      

  3.   

    今天上来是来提问题来了,但还是先回答你这个问题吧。
    问题出在这一行,FS.Read(Str,4*sizeof(char)); 中的 Str 是一个 String;
    我比较认同 linzhengqun(风。爱的翔舞) 的做法。
    如果按照你的思路也可以这么做。procedure TF_DatFile.BitBtn2Click(Sender: TObject);
    var
      FS: TStream;
      Str:string;
    begin
      FS:=TFileStream.Create('c:\1.dat', fmOpenRead);
      try
        SetLength(Str,FS.Size);
        FS.Read(Str[1],4*sizeof(char));
        ShowMessage(str);
      finally
        FS.Free;
      end;
    end;以上代码 Delphi 6 下测试通过,没有问题。