现在我有一个Record类型的数据结构,比方说是
TTest = Record
   Name: string;
   Caption: String;
   ......
end;   //注意,这里的Record里的项都是String类型,而不是String[255]样的短字符串类型. 也就是这里面的String类型的项有可能包含的字符串很长很长。现在我想把这个结构所包含的数据保存到文件中,通过BlockRead, BlockWrite来读取和保存,还望高手能给我一个例子,最好贴源码,也可以发邮件给我 [email protected]
非常感谢!

解决方案 »

  1.   

    好像string型是不行的,因为不定长。
      

  2.   

    不一定,如果string类型没有超过255的是可以的, 
    我想问的是当String很长的时候应该怎么办啊,
    又或者说,我有很多分类信息,每一种信息都是String类型的,可能很长,通过什么方式来保存到文件中,之后也能从文件中读出信息。。
    高手帮忙
      

  3.   

    我在网络传输RECORD的时候,对于这种情况是这样处理的:TTest = Record
       Name: array[0..99] of string[255];//数组的长度是根据具体情况而定
       ......
       ......
    end;不知道对您有没有帮助.
      

  4.   

    这么说吧,
    现在我有这么一个人信息:
    姓名: AAAA
    年龄: 32
    简历: //这里的内容很长,具体长度不一定。现在我想把这么一个信息保存到文件中,并可以从这文件读取这些信息(保存成二进制格式),有没有高手帮忙啊。
    谢谢!
      

  5.   

    除了老冯的办法,看来还真是不行呀,string类型过长在record类型中是不能使用的。可以嫁接!建立一个数组。保存的时候,按照字符个数分组来保存就是了
      

  6.   

    可以的话,帮忙,贴个源码或是发个邮件,谢谢,
    [email protected]非常感谢! 加分50
      

  7.   

    晕,邮箱写错了,

    [email protected]
      

  8.   

    unit UFileRecordStream;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TEmployee = packed record
        Name: string[10];
        Gender: string[2];
        Age: Integer;
        ResumeSize: Integer;
      end;
      
      TFormDemo = class(TForm)
        ButtonWrite: TButton;
        ButtonRead: TButton;
        EdtName: TLabeledEdit;
        EdtGender: TLabeledEdit;
        EdtAge: TLabeledEdit;
        Resume: TMemo;
        LabResume: TLabel;
        PnlPicture: TPanel;
        Picture: TImage; //留着你来完成
        procedure ButtonWriteClick(Sender: TObject);
        procedure ButtonReadClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FormDemo: TFormDemo;implementation{$R *.dfm}procedure TFormDemo.ButtonWriteClick(Sender: TObject);
    var
      F: File;
      Employee: TEmployee;
      Buffer: array of PChar;
      BufferSize: Integer;
      Stream: TStream;
    begin
      AssignFile(F, 'F:\Employee.Dat');
      Reset(F, 1);
      Stream := TMemoryStream.Create;
      try
        Resume.Lines.SaveToStream(Stream);
        BufferSize := Stream.Size;
        SetLength(Buffer, BufferSize);
        Stream.Position := 0;
        Stream.ReadBuffer(Pointer(Buffer)^, BufferSize);
        Employee.Name := EdtName.Text;
        Employee.Gender := EdtGender.Text;
        Employee.Age := StrToInt(EdtAge.Text);
        Employee.ResumeSize := BufferSize;
        BlockWrite(F, Employee, SizeOf(Employee));
        BlockWrite(F, Pointer(Buffer)^, BufferSize);
      finally
        Stream.Free;
        CloseFile(F);
      end;
    end;procedure TFormDemo.ButtonReadClick(Sender: TObject);
    var
      F: File;
      FMode: Integer;
      Employee: TEmployee;
      Buffer: array of PChar;
      BufferSize: Integer;
      Stream: TStream;
    begin
      AssignFile(F, 'F:\Employee.Dat');
      FMode := FileMode;
      FileMode := 0;
      Reset(F, 1);
      Stream := TMemoryStream.Create;
      try
        BlockRead(F, Employee, SizeOf(Employee));
        EdtName.Text := Employee.Name;
        EdtGender.Text := Employee.Gender;
        EdtAge.Text := IntToStr(Employee.Age);
        BufferSize := Employee.ResumeSize;
        Seek(F, SizeOf(Employee));
        SetLength(Buffer, BufferSize);
        BlockRead(F, Pointer(Buffer)^, BufferSize);
        Stream.WriteBuffer(Buffer[0], BufferSize);
        Stream.Position := 0;
        Resume.Lines.LoadFromStream(Stream);
      finally
        Stream.Free;
        CloseFile(F);
        FileMode := FMode;
      end;
    end;{ps: 留个作业你自己完成:加入你的照片. 最好还加上背景音乐。呵呵呵呵。}end.
      

  9.   

    TO: 老冯。请问一下这里为什么要把FileMode设为0啊?
      

  10.   

    FileMode设为0
    =========
    只读Read-only