写了一个简单的读写流的类,功能是
读出流的某个部分和写入流的某个部分
type
    TBufmanager = class(TInterfacedObject, IBufferManager)
    private
      streamtosend:TStream;
      recvstream:TMemoryStream;
    public
        procedure init(stream: TStream; PackCout: integer);
        procedure writeBuf(packnum: integer; Buf: Pointer; size: integer);
        procedure readBuf(packnum: integer; var Buf: Pointer; var size: integer);
        procedure recvFinished(savefilename:string);
    end;
const FRAME_SIZE=10
implementation
     uses main;
{ TBufManager }
procedure TBufmanager.init(stream: TStream; PackCout: integer);
begin
   if (streamtosend=nil) and (stream<>nil) then
   begin
    streamtosend:=stream;
   end;
   if recvstream=nil then
    recvstream:=TMemoryStream.Create;
end;procedure TBufmanager.readBuf(packnum: integer; var Buf: Pointer;
    var size: integer);
var
  actualsize:integer;
begin
  streamtosend.Position:=packnum*FRAME_SIZE;
  size:=streamtosend.Read(Buf,size);
end;procedure TBufmanager.recvFinished(savefilename:string);
begin
  if recvstream<>nil then
   begin
    DeleteFile(savefilename);
    recvstream.SaveToFile(savefilename);
   end;
end;procedure TBufmanager.writeBuf(packnum: integer; Buf: Pointer;
    size: integer);
begin
  recvstream.Position:=packnum*FRAME_SIZE;
  recvstream.Write(Buf,size);
end;
end.建一个文件“bb.txt”,内容为“0123456789ABCDEFGHIJ”;共20个字符。
对上面这个类写了一个过程来测试。
var
  bufmanager:TBufmanager;
  stream:TFileStream;
  p1:Pointer;
  i:integer;
begin
  stream:=TFileStream.Create('bb.txt',fmOpenRead or fmShareDenyWrite) ;
  bufmanager:=TBufmanager.Create;
  bufmanager.init(stream,6);
  i:=FRAME_SIZE;
  bufmanager.readBuf(1,p1,i);
  bufmanager.writeBuf(0,p1,i);
  bufmanager.recvFinished('recv.txt');
end;
结果recv.txt的内容的是前四个字符是“ABCD”,但是后六个字符全都是乱码。
请各位大大指教。

解决方案 »

  1.   

    你的代码有多处错误。1,p1指针,没申请就进行了操作,readbuf(1,p1,i),没出现异常是你运气好。
    2, size:=streamtosend.Read(Buf,size);只是把数据写到了指针地址里,没写入指针的指向的空间,改成  size:=streamtosend.Read(Buf^,size);
    3,recvstream.Write(Buf,size);也一样的错误,改成recvstream.Write(Buf^,size);
      

  2.   

    为什么刚好写入了ABCD,是因为,一个指针地址是个整型,有4个字节,刚好这个地址能存下ABCD,所以在写入recv.txt的时候,刚好能把ABCD写入,其他的都写入了非法空间。