PItem:^TItem;
TItem = Record 
  Name:String;
  ID:integer;
  end;
Procedure Save();
var
  F:TFileStream;
  P:PItem;
Begin
  P:=New(PItem);
  FillMemory(P,0,SizeOf(p));
  P.Name:='Test';
  p.ID:=0;
  F:=TFileStream.Create('C:\1.txt',fmCreate or fmOpenWrite);
  F.write(p^,Sizeof(p^));//改成 F.write(p,Sizeof(p));也差不多
  F.Free;
  FreeMemory(P);
//我看了保存的文件,只存到P的地址,只有四个字节。
end;Procedure Read();
var
  F:TFileStream;
  P:PItem;
Begin
  P:=New(PItem);
  FillMemory(P,0,SizeOf(p));
  F:=TFileStream.Create('C:\1.txt',fmOpenRead);
  F.Read(p^,Sizeof(p^));
  F.Free;
  ShowMessage(p^.Name);
  FreeMemory(P);
end;怎样可以保存到正确的自定义数据类型?我要保存的是一个TList,里面的数据是自定义类型。

解决方案 »

  1.   

    将这一行去掉就可以了 save函数中
    FillMemory(P,0,SizeOf(p));
      

  2.   

    PFileItem=^TFileItem;
      TFileItem=Record
        Title:String[255];
        FilePath:String[255];
        FileInfo:String[255];
        FileID:String[13];
        ImageIndex:Integer;
        end;
    var
      FFileList:TList;
    ……
    ……
    ……function TMainForm.SaveToFile(const Filename: String): TDocinfo;
    var
      f:TFileStream;
      i,n:Integer;
      Data:PFileItem;
      t:TTreeView;
    begin
      f:=TFileStream.Create(filename,fmCreate or fmOpenWrite);
      t:=TTreeView.Create(self);
      t.Parent:=Self;
      t.Visible:=false;
      t.Items.Assign(tvFiles.Items);
      f.WriteComponentRes (t.ClassName,t);
      t.Free;
      f.WriteBuffer (FFileList.Count,Sizeof(integer));
      for i:=0 to FFileList.Count -1 do
      begin
        Data:=New(PFileItem);
        Data:=GetFileItem(i);
        f.WriteBuffer(Data^,sizeof(Data^));
        n:=Sizeof(Data^);
        FreeMemory(Data);
      end;
      f.Free;
    end;function TMainForm.ReadFromFile(const FileName: String): TDocinfo;
    var
      f:TFileStream;
      i,Count:Integer;
      Data:PFileItem;
      t:TTreeView;
    begin
    try
      for i:=FFileList.Count - 1 downto 0 do
      begin
        FFileList.Delete(i);
        DeleteFileItem(i);
      end;
      tvFiles.Items.BeginUpdate;
      f:=TFileStream.Create(filename,fmOpenRead);
      t:=TTreeView.Create(self);
      t.Parent:=Self;
      t.Visible:=false;
      f.ReadComponentRes (t);
      tvFiles.Items.Assign(t.Items);
      t.Free;
      f.ReadBuffer (Count,Sizeof(integer));
      for i:=0 to Count -1 do
      begin
        Data:=New(PFileItem);
        f.ReadBuffer(Data^,sizeof(TFileItem));
        FFileList.Add(Data);
      end;
    finally
      f.Free;
    end;
      lvFiles.Items.Count:=FFileList.Count;
      lvFiles.Repaint;
    end;
    在读出来的数据里有些值不对是怎么回事?还有,如果我不固定String 的大小,用SizeOf就不会得到他的正确大小了,这是怎么回事?
    例如:
        PTest=^TTest;
        TTest = Record
          Txt:String;
          ID:Integer;
          end;
        var
          p:PTest;
          Size:Integer;
        Begin
          p:=New(PTest);
         Size:= SizeOf(p^);//Size = 11;
         p.Txt:='This is a test of Record Data Save';
        Size:=Sizeof(p^);/Size还是11;
         
      

  3.   

    你要存结构文件,可以使用结构文件来存啊
    xxx = record
      ...
      ...
    end;var
      fText :File of xxx;
      z :xxx;
    begin
      assignfile(fText, '文件路径');
      reset(fText);
      Seek(z, sizeof(z));
      try
        write(z, fText);
      finally
        CloseFile(fText);
      end;
    end;         //这样整个结构就写入文件了
      

  4.   

    今天在家里试了一下,发现不用指针用结构的话就能正常的读出值来
    用指针就不行,好像是SIZEOF函数有问题还请高手出来看看Procedure Save();
    var
      F:TFileStream;
      P:tItem;
    Begin
      //P:=New(PItem);
      //FillMemory(P,0,SizeOf(p));
      P.Name:='Test';
      p.ID:=0;
      F:=TFileStream.Create('C:\1.txt',fmCreate or fmOpenWrite);
      f.position := 0;
      F.write(p,Sizeof(p));//改成 F.write(p,Sizeof(p));也差不多
      F.Free;
      //FreeMemory(P);
    end;Procedure Read();
    var
      F:TFileStream;
      P:tItem;
    Begin
      //P:=New(PItem);
      //FillMemory(P,0,SizeOf(p));
      F:=TFileStream.Create('C:\1.txt',fmOpenRead);
      f.position := 0;
      F.Read(p,Sizeof(p));
      F.Free;
      ShowMessage(p.Name);
      //FreeMemory(P);
    end;
      

  5.   

    但String 类型的数据大小不是一定的呀,写的时候就不能完全写下去,读的时候也读不全。