(Wide)String - storing in TFileStream, Delphi 7. What is the fastest way?

前端 未结 4 1066
[愿得一人]
[愿得一人] 2021-01-02 23:28

I\'m using Delphi7 (non-unicode VCL), I need to store lots of WideStrings inside a TFileStream. I can\'t use TStringStream as the (wide)strings are mixed with binary data, t

4条回答
  •  既然无缘
    2021-01-02 23:52

    You can also use TFastFileStream for reading the data or strings, I pasted the unit at http://pastebin.com/m6ecdc8c2 and a sample below:

    program Project36;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils, Classes,
      FastStream in 'FastStream.pas';
    
    const
      WideNull: WideChar = #0;
    
    procedure WriteWideStringToStream(Stream: TFileStream; var Data: WideString);
    var
      len: Word;
    begin
      len := Length(Data);
      // Write WideString length
      Stream.Write(len, SizeOf(len));
      if (len > 0) then
      begin
        // Write WideString
        Stream.Write(Data[1], len * SizeOf(WideChar));
      end;
      // Write null termination
      Stream.Write(WideNull, SizeOf(WideNull));
    end;
    
    procedure CreateTestFile;
    var
      Stream: TFileStream;
      MyString: WideString;
    begin
      Stream := TFileStream.Create('test.bin', fmCreate);
      try
        MyString := 'Hello World!';
        WriteWideStringToStream(Stream, MyString);
    
        MyString := 'Speed is Delphi!';
        WriteWideStringToStream(Stream, MyString);
      finally
        Stream.Free;
      end;
    end;
    
    function ReadWideStringFromStream(Stream: TFastFileStream): WideString;
    var
      len: Word;
    begin
      // Read length of WideString
      Stream.Read(len, SizeOf(len));
      // Read WideString
      Result := PWideChar(Cardinal(Stream.Memory) + Stream.Position);
      // Update position and skip null termination
      Stream.Position := Stream.Position + (len * SizeOf(WideChar)) + SizeOf(WideNull);
    end;
    
    procedure ReadTestFile;
    var
      Stream: TFastFileStream;
    
      my_wide_string: WideString;
    begin
      Stream := TFastFileStream.Create('test.bin');
      try
        Stream.Position := 0;
        // Read WideString
        my_wide_string := ReadWideStringFromStream(Stream);
        WriteLn(my_wide_string);
        // Read another WideString
        my_wide_string := ReadWideStringFromStream(Stream);
        WriteLn(my_wide_string);
      finally
        Stream.Free;
      end;
    end;
    
    begin
      CreateTestFile;
      ReadTestFile;
      ReadLn;
    end.
    

提交回复
热议问题