Delphi 2010:如何将整个记录保存到文件中?

Mah*_*00d 19 delphi file-io delphi-2010

我已经定义了一个记录,其中包含许多不同类型的字段(整数,实数,字符串,...以及"数组..."的动态数组).我想将它作为一个整体保存到文件中,然后能够将其加载回我的程序.我不想单独保存每个字段的值.文件类型(二进制或ascii或...)并不重要,因为Delphi可以将其读回记录.

你有什么建议吗?

And*_*dré 20

只要不使用动态数组,就可以直接在流中加载和保存记录的内存.因此,如果您使用字符串,则需要修复它们:

type TTestRecord = record 
  FMyString : string[20]; 
end; 

var 
  rTestRecord: TTestRecord;
  strm : TMemoryStream; 

strm.Write(rTestRecord, Sizeof(TTestRecord) );
Run Code Online (Sandbox Code Playgroud)

您甚至可以一次加载或保存一组记录!

type TRecordArray = array of TTestRecord;

var ra : TRecordArray; 

strm.Write(ra[0], SizeOf(TTestRecord) * Length(ra));
Run Code Online (Sandbox Code Playgroud)

如果你想写动态内容:

iCount   := Length(aArray);
strm.Write(iCount, Sizeof(iCount) );      //first write our length
strm.Write(aArray[0], SizeOf * iCount);   //then write content
Run Code Online (Sandbox Code Playgroud)

之后,你可以回读:

strm.Read(iCount, Sizeof(iCount) );       //first read the length
SetLength(aArray, iCount);                //then alloc mem
strm.Read(aArray[0], SizeOf * iCount);    //then read content
Run Code Online (Sandbox Code Playgroud)

  • 您可以手动将状态写入流,请参阅我编辑的版本... (4认同)
  • 提及不使用动态数组/字符串的+1 (3认同)

Kry*_*gaj 11

正如这里所承诺的那样:http://kblib.googlecode.com

当您将示例记录定义为:

TTestRecord = record
  I: Integer;
  D: Double;
  U: UnicodeString;
  W: WideString;
  A: AnsiString;
  Options: TKBDynamicOptions;

  IA: array[0..2] of Integer;

  AI: TIntegerDynArray;
  AD: TDoubleDynArray;
  AU: array of UnicodeString;
  AW: TWideStringDynArray;
  AA: array of AnsiString;

  R: array of TTestRecord; // record contain dynamic array of itself (D2009+)
end;
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式将整个动态记录保存为流(作为二进制数据):

TKBDynamic.WriteTo(lStream, lTestRecord, TypeInfo(TTestRecord));
Run Code Online (Sandbox Code Playgroud)

要加载它:

TKBDynamic.ReadFrom(lStream, lTestRecord, TypeInfo(TTestRecord));
Run Code Online (Sandbox Code Playgroud)

它不需要是一个记录,你可以为任何动态类型做同样的事情,如:

TKBDynamic.WriteTo(lStream, lStr, TypeInfo(UnicodeString));
TKBDynamic.WriteTo(lStream, lInts, TypeInfo(TIntegerDynArray));
TKBDynamic.WriteTo(lStream, lArrayOfTestRecord, TypeInfo(TArrayOfTestRecord)); // TArrayOfTestRecord = array of TTestRecord;
Run Code Online (Sandbox Code Playgroud)

在Delphi 2006/2009/XE上测试.许可证:MPL 1.1/GPL 2.0/LGPL 3.0有关信息,请参阅自述文件.

  • +1这非常有效.代码可以与即将推出的64位编译器兼容,通过使用NativeUInt而不是基数来进行指针运算. (2认同)