kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  207 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PChar;
  i: Integer;
  str:String;
  begin
       iFileHandle := FileOpen('C:\test.t', fmOpenRead);
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
      FileClose(iFileHandle);
      for i := 0 to iBytesRead-1 do
      begin
        str := str + IntToStr(Integer(Buffer[i]));
      end;
end;

在delphi中其中读写函数的buffer声明,

function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;

function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;

 

当在本地函数声明Buffer为PChar类型,意识是char 类型指针.即在Buffer所指的是一个char类型的地址.

如果直接写为FileRead(handle,Buffer,count)时,是不能正确读写数据的.看上去是把Buffer作为指针传入,但在Delphi中,该FileRead用Buffer参数,不能直接传递指针,而是需要传递指针所指的地址.因而得用Buffer^方式传入.

当const Buffer说明必须是常量地址,因而直接用Buffer的话,则实际上把指针地址传入.也就是存放地址的变量地址传入,无疑是读写不出.

而用var Buffer,则表示Buffer应该是可以改写内容的地址,而若直接写入Buffer,则就是把存放地址的变量地址传入.毁掉的也只是buffer中所指的地址.

和c有些不同.在实际出现这样的问题,不得不察.

posted on 2009-03-27 18:27 kenlistian 阅读(4107) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。