Newsgroup: it.comp.lang.delphi
Titolo: Match su Stream: possibile?

Salve a tutti!
Vi espongo il problema e poi passo alla domanda...
Ho un file e devo verificare se al suo intrerno contiene una certa 
stringa... Il file non puň essere letto con TStringList.LoadFromFile perchč 
contiene caratteri strani che forzano l'interruzione della lettura del file 
non apena questi vengono incontrati...
Ho pensato quindi di aprire il file in oggetto come un TFileStream ed 
infatti il file viene letto per intero... La mia domanda invece č: esiste 
una istruzione per eseguire la ricerca della stringa all'interno dello 
stream o devo scriverla io? Per quanto ne so io, non esiste e devo scrivere 
io il codice per la ricerca, mi sbaglio? Potreste, in questo caso, 
gentilmente indicarmi l'istruzione?
Grazie sin d'ora,
     Stefano 

 stream o devo scriverla io?
TFileStream è una classe e come tale i suoi metodi sono documentati 
nella guida in linea.
Se non esiste un metodo che lo fa tocca scriverselo; nel caso molto 
dipende dalla grandezza del file.
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"

 Ho pensato quindi di aprire il file in oggetto come un TFileStream ed 
TStringStream questo sconosciuto... documentati sull'help.
Andrea

 dipende dalla grandezza del file.
Grazie per la risposta, ma non l'ho capita... Il file di help è stato il 
primo posto dove ho guardato: su TFileStream non c'è nulla che abbia 
risposto alle mie esigenze... per questo ho chiesto un vostro parere qui sul 
newsgroup... infatti, ci potrebbe essere una Unit che definisce istruzioni 
su TStream (analoga ad StrUtils, ad esempio) che, a meno che non la si 
conosca per nome, difficilmente è difficile trovarla... ad ogni modo, visto 
che l'operazione che devo eseguire è piuttosto comune, mi chiedevo se per 
caso conoscete codice di terze parti che risponde alle mie esigenze... 
l'algoritmo di matching (sicuramente naive, non ho velleità -per ora- di 
ottenere codice ottimizzato) non mi pare troppo complesso da realizzare (ad 
occhio e croce sono due cicli innestati l'uno nell'altro: il primo scandisce 
lo stream, l'altro il buffer di match; condizioni di uscita: fine stream o 
match - detto molto in breve), ma se c'è codice già fatto, allora tanto vale 
riusarlo...
Ad ogni modo grazie per avermi dedicato 5 minuti del tuo tempo...
Stefano 


Leggere i messaggi per intero, questo sconosciuto ;-)
Se legge un file binario come stringa, al primo #0 che trova si ferma.
Stefano, ho paura che tu debba implementare una tua routine di ricerca
(per altro neppure troppo complessa).
Ciao.
-- 
Ore 18.30: premo invio.

 non apena questi vengono incontrati...
Il modo migliore di procedere è usare un memory mapped file.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/file_mapping.asp
Usando un puntatore a un vettore di 0 byte hai la comodità di lavorare con
uno pseudo vettore grande quanto il file, e puoi fare la ricerca byte a
byte.
Non ti devi preoccupare della grandezza del file, sarà il SO a caricarlo
in memoria intero o a blocchi secondo le necessità.
Saluti,
Antonio
procedure TForm1.Button1Click(Sender: TObject);
type
  MyArray = array[0..0] of Byte;
var
  I, Size, L, z: LongInt;
  Fh, FileMap: THandle;
  Memory: ^MyArray;
  StrMatch, nomefile: string;
  Esiste: boolean;
begin
  StrMatch:= 'trovami';
  nomefile:= 'c:\prova.txt';
 
  L:= Length(StrMatch);
  Fh:= CreateFile(PAnsiChar(nomefile), GENERIC_READ or GENERIC_WRITE, 0,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if (Fh <> INVALID_HANDLE_VALUE) then
   begin
     Size:= GetFileSize(Fh, nil);
     FileMap:= CreateFileMapping(Fh, nil, PAGE_READWRITE, 0, 0, nil);
     if (FileMap <> 0) then
      begin
        Memory:= MapViewOfFile(FileMap, FILE_MAP_WRITE, 0, 0, 0);
        if (Memory <> nil) then
         begin
           Esiste:= False;
           for I:= 0 to Size-1 do
            begin
              z:= 0;
              while (z < L) and (Ord(StrMatch[z+1]) = Memory^[I+z]) and
(I+z < Size) do Inc(z);
              if (z = L) then
               begin
                 Esiste:= True;
                 break;
               end;
            end;
           UnmapViewOfFile(Memory);
           if Esiste then ShowMessage('Stringa esistente');
         end
        else ShowMessage('Errore nella mappatura del file in memoria.');
        CloseHandle(FileMap);
      end
     else ShowMessage('Errore nell''allocazione della memoria.');
     CloseHandle(Fh);
   end
  else ShowMessage('File '+nomefile+' non trovato.');
end;
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:d4d6f9$6ih$1...@news.newsland.it...
