请大家帮忙看看var ms:TMemoryStream;
    Buffer:array of Byte;操作:
Ms := TMemoryStream.Create;
Ms.LoadFromFile('d:\1.exe');
setlength(buffer,sizeof(ms));
ms.read(Buffer,Sizeof(ms));read以后已分配空间的buffer反而没有空间了
不知道错在哪里

解决方案 »

  1.   

    Ms := TMemoryStream.Create;
    Ms.LoadFromFile('d:\1.exe');
    Ms.Position := 0;
    setlength(buffer, ms.size);
    ms.read(Buffer,ms.size);
      

  2.   

    setlength(buffer, ms.size);
    ms.read(Buffer,ms.size);
    //sizeof(ms)只得到了一个指针的大小即4
      

  3.   

    好象是没认识到这个问题,晕啊如果是sizeof(buffer)呢?
      

  4.   

    ms.read(buffer,sizeof(buffer))有没有问题?
    我在setlenth的时候正常,先取得ms.size再设置长度的(上面的代码是我临时写,不是照抄的)
    只是读内容到缓冲的时候清空了缓冲的内存分配,不知为什么会这样不过上面的问题确实没有意识到
      

  5.   

    你得看一下Sizeof函数的意思,Sizeof是取得变量所占内存,Buffer是一个指针,当然就只有四个字节了。
      

  6.   

    贴一下我的代码:
      Buf: array of Byte;
      BufDest: array of Byte;  Fs := TFileStream.Create('d:\tt.lib', fmCreate);
      Ms := TMemoryStream.Create;
      Ms.LoadFromFile('D:\tt.tmp');
      SourceLen := Ms.Size;
      Fs.Write(SourceLen, SizeOf(SourceLen));  SetLength(Buf,SourceLen);  //分配内存
      SetLength(BufDest,SourceLen);  //FillChar(Buf, Length(Buf), 0);  //释放了Buf的内存  Ms.Read(Buf, Length(Buf));  //结果也会导致buf内存被释放
      //FillChar(BufDest, Length(BufDest), 0);
      pBufDest:= @BufDest;
      DestLen:=Length(BufDest);
      Err:=Compress(pBufDest,DestLen,Buf,Length(Buf));   
      if Err=0 then
        Fs.Write(BufDest, DestLen);
      Fs.Free;
      Ms.Free;
    现在主要问题是:当MS.read的时候有问题,缓冲被释放而且DELPHI帮助里举有SozeOf例子:FillChar(Buf,SizeOf(Buf),0)
    如果SizeOf不能用于指针的话,这例子就有问题了?
      

  7.   

    ms.read(Buffer,Sizeof(ms));
    这是错误的写法,但编译器并不会报错.应该写成下面这样.
    ms.read(pchar(Buffer)^,Sizeof(ms));
    或者
    ms.read(pchar(Buffer)^,length(Buffer));//显然,我更喜欢这样写.
      

  8.   

    不错,按楼上的没有问题了,不过感觉这是不是复杂了一点
    而且DELPHI帮助都有例子:FillChar(Buf,SizeOf(Buf),0),不知为什么我这里用就不行新发现一个问题,上面的代码最后Ms.Free的时候出错,不知又是为什么
    请帮忙看看这个贴子我会再加分:)
      

  9.   

    Delphi例子中的buf指的是数组,比如array[0..125] of char之类。数组不是指针。
      

  10.   

    FillChar(Buf,SizeOf(Buf),0),
    帮助上这个例子,其中BUF一定要是静态数组或者静态分配的RECORD之类的,
    原因很简单,SIZEOF只是编译时处理的东西.就同C/C++的SIZEOF运算符类似.
      

  11.   

    另外,当BUF是STRING型时,这是种编译器内部支持类型,
    STRING变量的首地址并不是数据首地址.
    所以必须pchar(buf)^才是它实际数据位置.
      

  12.   

    不好意思,二天没来
    这下关于sizeof是清楚了只是释放内存流的问题是什么原因?
    无论是释放还是清除都出错:(
      

  13.   

    动态数组你为何要去释放它?
    它靠引用计数维持.
    SETLENGTH分配的内存,你用FREEMEM方式释放当然要出错.
      

  14.   

    var
      ms: TMemoryStream;
      Buffer: array of Byte;
    begin
      Ms := TMemoryStream.Create;
      Ms.LoadFromFile('C:\Documents and Settings\Administrator\桌面\新建 文本文档.txt');
      SetLength(buffer, ms.Size);  //*1
      ms.read(Buffer[0], Length(Buffer));  //*2
      ShowMessage(string(buffer));
      ms.Free;
    end;
      

  15.   

    楼上的使用buffer没有问题不过ms.free时还是会出错:(