研究一下结构化文件的知识吧。
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
             毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
  I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
       

解决方案 »

  1.   

    1: Byte
    2: FileName: File of 结构名
       buffer: array[] of 结构名
       用  Read() 读  注意: 是Read() 而不是 ReadLn() 或BlockRead()
           Write() 写
      

  2.   

    这是我的代码:type
            TPACK_DATA = class
                    app_name: string;
                    exe_data: TMemoryStream;
            end;
    var
       pd:TPACK_DATA;
       MS: TMemoryStream;
       f:integer;
    begin
       pd := TPACK_DATA.Create;
            pd.app_name := 'test';        MS := TMemoryStream.Create();
            MS.LoadFromFile('c:\kkk.exe');    //kkk.exe 大小为 700K
            pd.exe_data:=Tmemorystream.Create;
            pd.exe_data.loadfromstream(ms);
            f:=filecreate('c:\test.pak');
            filewrite(f,pd,sizeof(pd));
            fileclose(f);
            pd.Free;
      
    //为什么写出的'c:\test.pak' 总是1K ??? 奇怪
      

  3.   

    bobit(迎着风):
       请详细一点好吗?
      

  4.   

    不是 ms.loadfromfile 了之后,sizeof(ms) 就是文件的大小了吗?
      

  5.   


            pd.exe_data:=Tmemorystream.Create;
            
            //加一名句(IE又出错了,打字都错)
            ms.Position := 0;         pd.exe_data.loadfromstream(ms);
            f:=filecreate('c:\test.pak');
            filewrite(f,pd,sizeof(pd));
            fileclose(f);
            pd.Free;
      

  6.   

    我用 showmessage(inttostr(sizeof(pd.exe_data)));显示 “4” ??????????????????
      

  7.   

    copy_paste(木石三):   加了也一样啊。。
      

  8.   

    Delphi的对象也就是对象指针,所以用SizeOf(Object)都是4读文件:
    var
      P: Pointer;
      Buffer: Pointer;
    begin
      with TFileStream.Create('FileName', fmOpenRead or fmShareDenyNone) do
      try
        GetMem(Buffer, Size);  
        try
          P := Buffer;    //Buffer为首地址,保存, P为引用Buffer指针
          //处理文件流P
        finally
          FreeMem(Buffer);
        end;
      finally
        Free;
      end;
    end;在这里Buffer里面二进制内存,也可以是字符集。。
    关键是你用什么来指针来指向它。如
     P: PChar;   P := Buffer;
       //字符
       S := StrPas(P);
       ShowMessage(S);var
      P: PByte;   P := Buffer;
       I := P^;   
       //Byte类型
       ShowMessage(IntToStr(I));如此类推,PDWORD, FPInteger, 之类的转成各种类型了。
    :)
      

  9.   

    那看来是fileWrite()的问题了
    变成这样试试
    AssignFile(f,'c:\test.pak');
    Rewrite(f);
    Write(f,pd,sizeof(pd));
    fileclose(f);
    pd.Free;
      

  10.   

    正确代码:
    var
       pd:TPACK_DATA;
       MS: TMemoryStream;
       f:TFileStream;
    begin
       pd := TPACK_DATA.Create;
            pd.app_name := 'test';        MS := TMemoryStream.Create();
            MS.LoadFromFile('h:\AA.txt');    //kkk.exe 大小为 700K
            MS.Position := 0;
            pd.exe_data:=Tmemorystream.Create;
            pd.exe_data.loadfromstream(ms);
            f := TFileStream.Create('H:\test.txt',fmCreate);// f  :=filecreate('H:\test.txt');
    0A        ShowMessage(IntToStr(MS.Size));
            MS.Position := 0;
            f.CopyFrom(pd.exe_data,pd.exe_data.Size);
            FreeAndNil(f);
            pd.Free;
    end;
    —————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
    I.Desire := '加不加分随你';
    —————————————————————————————————
           
      

  11.   

    sizeof表示类型的字节长度而不是实例的内存容量
    —————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
    I.Desire := '加不加分随你';
    —————————————————————————————————
           
      

  12.   

    哦,看错了,应该是你这句出问题:filewrite(f,pd,sizeof(pd));
    这里SizeOf(pd) = SizeOf(Object) + SizeOf(String) 
                        4           +      4
    Object = 4, string = 4;
    你没有为它们分配空间,所以字节数为8,你看一下文件应该是8字节的内容吧
    TPACK_DATA = class
      app_name: string;
      exe_data: TMemoryStream;
    end;FileWrite(F, pd.app_name[1], Length(pd.App_name));
    FileWrite(F, pd.Exe_data.Memory^, pd.Exe_Data.Size);这样应该没问题了吧。
    其它你的程序应该这样写:
    var
      P: Pointer;
      SourceFileName: string;
      SourceStream, DestStream: TFileStream;
    begin
      SourceFileName := 'SourceFileName';
      SourceStream := TFileStream.Create(SourceFileName, fmOpenRead);
      DestStream := TFileStream.Create('DestFileName', fmCreate);
      try
        DestStream.WriteBuffer(SourceFileName[1], Length(SourceFileName));
        DestStream.WriteBuffer(SourceStream.Memory^, SourceStream.Size);
      finally
        SourceStream.Free;
        DestStream.Free;
      end;
    end;这样简单吧。
    String 类型: 如果没有为它分配空间,那么它是指针类型,Default:'',sizeof() = 4;可以用Length()取得它的长度
    像用VC一般 char msg[100]都是分配空间的,Delphi也如此,var S: string[100];它的首地址是S[1](即是说它也可以当指针用)