1

What's the easiest way to search for a string within a memory stream (and multiple strings) and return true or false?

user1365875
  • 139
  • 2
  • 4
  • 15
  • 3
    Use e.g. [`Pos`](http://docwiki.embarcadero.com/Libraries/XE2/en/System.Pos) function and this [`piece of code`](http://stackoverflow.com/a/733322/960757). – TLama Apr 11 '13 at 14:00
  • 1
    start with fixing them to have the same encoding or charset. The same string value provides for ansolutely different byte values (TMemoryStream) in UTF-8, UTF-16 and non-Unicode encodings. – Arioch 'The Apr 11 '13 at 14:04
  • http://en.wikipedia.org/wiki/String_search – Arioch 'The Apr 11 '13 at 14:05
  • Do you ask about searching for one string in "multiple strings" or do you ask about searching for "multiple strings" within one memory stream ? – Arioch 'The Apr 11 '13 at 14:10

1 Answers1

2
var ms:TMemoryStream;
    strS:TStringStream;
    aStr:string;
    aPos:integer;
    found:boolean;
begin
    ms:=TMemoryStream.Create;
    ms.LoadFromFile('c:\aFile.txt');
    strS:=TStringStream.Create;
    strS.LoadFromStream(ms);
    aPos:=pos(aStr,strS.dataString);
    found:=aPos>0;
end;

TStringStream is an often forgetten but very useful tool - easier and safer than messing with pChars, etc.

For multiple searches, either ackwardly loop using pos,substring, etc or use a RegEx.

This code works fine in Delphi XE, although TStringStream is very old - not sure if it is unicode compliant.

(The example is leaky - I left out the finalization code for the sake of brevity)

Vector
  • 10,879
  • 12
  • 61
  • 101
  • 1
    In the newer Delphi versions TStringStream.Create has an overload that accepts TEncoding: http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStringStream.Create – iPath ツ Apr 16 '13 at 14:39