scherzi a parte,
quello che mi viene in mente ora è di ereditare da TFileStream ed implementare un 2 nuovi metodi tipo ReadDelimited e ReadDelimiters
ReadDelimited dovrebbe funzionare leggendo un byte alla volta (ReadByte) fino al raggiungimento di un delimitatore, tipo ExtractDelimited
https://www.freepascal.org/docs-html/rtl/strutils/extractdelimited.html (https://www.freepascal.org/docs-html/rtl/strutils/extractdelimited.html)
ReadDelimiters dovrebbe invece leggere in un buffer stringa tutti i delimitatori
in questo modo la sostituzione potrebbe avvenire con del codice tipo:
var filein, fileout: TMyFileStream; // la tua classe
letti:integer;
s: string;
begin
filein:=TMyFileStream.Create(...., read);
fileout:=TMyFileStream.Create(...., write);
repeat
letti:=filein.ReadDelimited(s, [' ', #10, #13, ','];
if letti >0 then begin
// sostituzione
if s='hello' then s:= 'ciao';
// scrittura
fileout.WriteBuffer(s[1], length(s));
end;
// ora leggiamo i delimitatori
letti:=filein.ReadDelimiters(s, [' ', #10, #13, ','];
if letti>0 then
fileout.WriteBuffer(s[1], length(s));
until letti=0;
end
Edit:
in questo modo occupi pochissima memoria anche processando file di grandi dimensioni