procedure TForm1.Button6Click(Sender: TObject);
var
  f1: file;
  Buf: array[0..127] of Char; //定义缓冲区
begin
  AssignFile(f1, fn3);
  try
    Reset(f1, 1);
    BlockRead(f1, Buf, SizeOf(Buf)); //读源文件
    ShowMessage(Buf);
  finally
    CloseFile(f1);
  end;
end;为什么读出的二进制文件总是空呢?

解决方案 »

  1.   

    文件名有没有赋值给fn3?缓冲区Buf的大小是不是超过了文件大小? 超过了,BlockRead会出错。
      

  2.   

    回jadeluo 
    fn3 已正确赋值
    buf大小远小于文件大小
    这些基本的都没问题
      

  3.   

    var
      MS: TMemoryStream;
      s: string;
    begin
      //读任意文件到字符串中
      MS := TMemoryStream.Create();
      MS.LoadFromFile(fileName);使用MemoryStream打开时也出错:cannot open file?
      

  4.   


    Open strName For Binary As #1
    put #1, , 'abcdefg'
    Close #1
    使用delphi应该怎样读取?
      

  5.   

    现在问题转化成 array of char 与string转换上了:
        for i := 0 to 127 do
          Edit1.Text := Edit1.Text + Buf[i];
    这样是能得出正确的字符串strpas(buf) 不行
    move  也不行
        SetLength(s, Length(Buf));
        Move(Buf, s[1], Length(Buf));还有简单高效的方法没?
      

  6.   

    试验了楼主的程序,没错呀var
      f1:file;
      f3:string;
      buf:array[0..127] of Char;
    begin
      f3:='123.txt';
      AssignFile(f1,f3);
      Reset(f1,1);
      BlockRead(f1,buf,Sizeof(buf));
      ShowMessage(buf);
      CloseFile(f1);
    end;直接就出来buf的字符。
    其实你想按字节来读,可使用TFileStreamvar
      MyStream:TFileStream;
      f3:string;
      buf:array[0..127] of Char;
    begin
      f3:='123.txt';
      MyStream:=TFileStream.Create(f3,fmOpenRead);
      MyStream.Read(buf,sizeof(buf));
      ShowMessage(buf);
      MyStream.Free;
    end;
      

  7.   

    里面有中文要怎么处理?如果把edit1换成string变量的话也不行: for i := 0 to 127 do 
          Edit1.Text := Edit1.Text + Buf[i];  for i := 0 to 127 do 
          S:= S + Buf[i];   //零长度空字符
      

  8.   

    使用TFileStream 还是空
      

  9.   

    指定下AmtTransferred,
    BlockRead(fl,buf,Sizeof(buf),numread);
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fl:file;
      f3:string;
      buf:array[0..127] of char;
      numread: Integer;
    begin
      if(OpenDialog1.Execute) then
      begin
        f3:=OpenDialog1.FileName;
      end;
      AssignFile(fl,f3);
      Reset(fl,1);
      FillChar(buf,SizeOf(buf),0);
      BlockRead(fl,buf,Sizeof(buf),numread);  ShowMessage();
      CloseFile(fl);
    end;
      

  10.   

    有可能二进制文件的内容是不能直接ShowMessage出来的内容。
    建议LZ先换一个纯文本文件来读一读试试,你最初的代码用来读文本文件是没问题的。
      

  11.   

    同意楼上的观点
    你的文件可能是UNicode的,这样ShowMessage是不可能正确读出的
      

  12.   

    其实主要是vb代码转delphi我这有个vb写的二进制文件,有vb代码,很短只有几行
    现在想用delphi写出一个相同格式的文件来
    试验了很久,总是有些错位哪个位高手能帮帮我?留下email,我可以把文件发过来
    另送200