用assignfile和read可以把一个二进制文件读取到一个byte数组,但处理函数需要提供一个pchar,该如何转化?或者如何直接读到一个pchar类型的变量中。
t:array of byte;
p:pchar;
如果用p:=@t;的话,得到的p只有一个字节。如何对p来setlength?

解决方案 »

  1.   

    Getmem(P,Length(T));第一个问题搞定
      

  2.   

    当然用完之后,别忘了
    FreeMem(P)
      

  3.   

    楼主,p:pchar就是像定义一个指针一样你应该指定他的大小啊!
      

  4.   

    用getmem不知为什么,p:=@t后还是一个字节。p:pchar定义时如何指定大小?
      

  5.   

    你用MemoryStream试一下。
    用Stream的LoadFromFile读取文件。
      

  6.   

    var
       p: PChar;
    begin
       // 创建指针
       p := StrAlloc(BufferSize);
       try
          // 拷贝数据到 PChar 中
          Move(p^, PByte(Buffer)^, BufferSize);      // 调用你的函数, 把 p 传入
          // ... ...     
       finally
          // 释放指针
          StrDispose(p);
       end;
    end;
      

  7.   

    我试了一下move,如果t是静态数组可以,
    t:array[0..1023] of byte
    但如果是动态数组就不行,
    t:array of byte
    setlength(t,1024);
    得到的p,处理结果不一样,但读取文件肯定是事先不知道大小的,请问在做这样的操作时需注意什么?
      

  8.   

    用getmem不知为什么,p:=@t后还是一个字节。我估计你是概念没搞清,p是和c语言兼容的字符串指针,你要求大小遇#0结束,你读的是二进制文件不能当字符串处理,因为里面竟是#0,应该按长度用move 和 read ,write进行读写!
      

  9.   

    to:outer2000(天外流星) 
    我知道这个函数,就是如果t是动态数组的时候,setlength(t,filesize(f))之后得到的p和事先知道文件大小,直接定义数组的大小得到的p不一样,处理结果也不一样。to:dongh(董宏)
    我知道p是指针,但如何才能用这个p表示一个二进制文件的内容(里面当然可能有很多0),我是先将文件当作字符数组处理(即读到t中),然后需要调用处理函数(需要提供pChar类型变量),函数中当然有长度作为一个参数,可处理结果我想象的不一样(比如作文件复制工作)。我读文件是用下面的方法
    var
        f:file of byte;
        b:byte;
        t:array of byte;
        i:integer;
    while not eof(f) do
    begin
        read(f,b);
        t[i]:=b;
        inc(i)
    end;
    这样一个字节一个字节好不好,是不是太慢了,有什么好办法?
      

  10.   

    如果用TFileStream是不是会好一点,但
    fs := TFileStream.Create('f:\123.jpg',fmOpenRead or fmShareDenyNone);
    得到的fs.size等于0,为什么??文件应该已经读出来了,紧接着
        try
            GetMem(tmp,fs.size);
            fs.ReadBuffer(tmp^,fs.Size);
            ShowMessage(InttoStr(length(Tmp)));
           FreeMem(tmp);
        finally
            fs.Free;
        end;
    showmessage输出4,虽然不对(估计是有0被当作字符串终止符),但不是0,文件的真正大小是113595字节。到底应该怎样利用TFileStream操作文件到PChar??望指教。
      

  11.   

    try
            GetMem(tmp,fs.size);
            fs.ReadBuffer(tmp^,fs.Size);
            ShowMessage(InttoStr(length(Tmp)));//实际数据已经过来了,你这样看不出来的,
        finally
          
           FreeMem(tmp);
           fs.Free;
        end;
      

  12.   

    既然数据已经过来了,那该如何处理呢?fs.size为什么会等于0??
    调用处理函数时参数是指针和长度,用tmp和fs.size?
      

  13.   

    先将数据取为字符串,在进行Pchar转换。