Newsgroup: it.comp.lang.pascal
Titolo: Cercare Stringhe in files

Devo trovare alcune stringhe in files assegnati con
"assign(file,'percorso');" e immagazzinare tutta la linea dal punto in cui
si trova la stringa.
Esempio file:
----inizio file----
blabla
Stringa parolevarie
blabla
----fine file-----
Io devo cercare all'interno del file la stringa e muovere "parolevarie" in
una variabile.
Spero di esser stato chiaro.
Nemesis


E la domanda quale sarebbe? Vuoi per caso il programma già bello e fatto?
--
KNOWLEDGE IS POWER
http://www.sverzat.com
¯`·.           .·´¯`:
'·.   .`·.   .·´.   .·'
   `:--·´   `·--:´
      `·. '_' .·
        ;`·-·´;

 E la domanda quale sarebbe? Vuoi per caso il programma già bello e fatto?
beh.. speriamo di no.. siamo ottimisti, vuole un consiglio dai.
allora nemesis, io non ho capito. tu vuoi estrarre parolevarie. ma dato che
tu non
sai come è composta la parola (logico altrimenti a che ti serve il file se
sai già che
la stringa è parolevarie??) suppongo che tu voglia estrarre la 3 stringa.
almeno così
si capisce, almeno io capisco così..
se è così, e le stringhe nel file sono separate da spazi, non devi fare
altro che aprire un
file di char, scorrere carattere per carattere, trovare gli spazi (attenzion
che la prima stringa
non è preceduta dallo spazio) e poi quando trovi il secondo spazio, inizi a
copiare in un variabile
tutti i caratteri fin quando non trovi il terzo spazio che indica la fine
della terza stringa e l'inizio della
quarta. non è complicato dai.. spero di esserti stato d'aiuto, ciao Augusto



Mi basterebbe semplicemente sapere come si cercano stringhe nei files.
Comunque volevo solo esssere chiaro!
Nemesis

Per fare quello che chiede Nemesi, proporrei una soluzone che mi hanno
mostrato al Politecnico proprio poco tempo fa, ovvero:
-scandisci il file dall'inizio alla fine
-acquisisci carattere per carattere e controlli se il carattere acquisito
corrisponde alla prima lettera della parola che ti interessa
- se corrisponde acquisisci un altro carattere e lo confronti con la seconda
lettera della parola che cerchi
- prosegui in questo modo fino alla fine della parola e poi, per tutto il
testo che rimane (while not eoln(tuofile)) acquisisci i caratteri e li sommi
ad una variabile di tipo stringa in modo che vengano accodati.
- A questo punto spetta a te decidere se uscire dal ciclo e proseguire
nell'elaborazione oppure proseguire nella scansione del file nel caso
potessi trovare un'altra stringa uguale alla precedente.
E' un po' complesso ma funziona: probabilmente c'è anche una soluzione
migliore, ma questa è quella che mi è venuta in mente ora.
Ciauz


Guarda il mio post precedente :)
Ciauz



Se io volessi cercare in un file molto lungo una stringa (per esempio
cercare in un file text la parola "PASCAL" e leggere cosa c'è dopo, per
esempio la sua versione), si dovrebbe fare:
stringa:=''; (*stringa:string;*)
Repeat
 Read(file,carattere); (*carattere è una varabile CHAR*)
 stringa:=stringa+carattere;
     If stringa='PASCAL' then begin
        stringa:='';
        Repeat
          read(file,carattere);
          stringa:=stringa+carattere;
       until carattere=chr(255); (* 255 è se non sbaglio lo spazio oppure
no?*)
     end;
Ho già provato ma non funziona, quindi ora non so cosa fare
Nemesis

  oppure no?*)
mmmh no... lo spazio e' #32... ma tu volevi l'intera riga o
solo la parola che segue ? se vuoi l'intera riga devi mettere
until carattere < #32, cioe' finche' non trovo un carattere
_non_ stampabile (tipo tab, ritorno a capo, etc) oppure
until carattere = #13 cioe' ritorno a capo
il metodo piu' efficace resta cmq quello proposto da Solid
Snake... non me l'hanno spiegato al Poli, pero' l'ho spesso
usato anch'io:
cerca solo il primo carattere della stringa che vuoi trovare.
Quando l'hai trovato potresti aver trovato l'inizio della tua
stringa: controlli sempre uno per volta i caratteri che
seguono e li confronti con quelli della stringa.. finche' sono
uguali va bene. Se ne trovi uno sbagliato, ricontrolli che
non sia il primo della stringa per sicurezza, e se non lo e'
vai avanti ancora nel file... butto giu' un po' di pseudo...
[ poi mi sono lasciato trasportare ed e' diventato codice... ops :-) ]
function findStr(var f:text; s: string): longint;
 var
  c: char;
 const  { variabili pre-inizializzate }
 {dopo il famoso thread sulle malvagie costanti
 oramai le uso cosi'... poi qualcuno ha fatto altri
 test poi su come vengono "compilate" ??}
  done: boolean = false;
  pos : byte = 1;
  cnt : longint = 1;
 begin
  while not ( eof(f) or done ) do
   begin
    read(f,c);  {leggi un char }
    inc(cnt);
    while ( (c = s[pos]) or (pos > 1) )
        and (not done) do {potrebbe andar bene}
     begin
      if c = s[pos] then {e' il char che vogliamo }
       if pos = length(s) then done := true {siamo alla fine}
       else begin { non ancora, avanti di uno }
             read(f,c);
             inc(cnt);
             inc(pos); {avanti nella stringa ! }
            end
      else { _non_ e' il char giusto ! }
        if c = s[1] then pos := 2  {potrebbe essere di nuovo il primo }
                    else pos := 1; {ok niente da fare riproveremo... fuori }
     end;
   end;
  if done then findStr := cnt - length(s)
   else findStr := -1; {stringa non trovata }
 end;
ok questa funzione ti trova una stringa in un file di testo a partire
dalla posizione corrente nel file... ti ritorna la posizione relativa
della stringa, e ti posiziona dopo la stringa stessa, quindi
con un semplice  readln(f,stringa); ottieni tutto il resto della riga
che contiene la parola... guarda com'e' fatta non usarla di brutto
che mi sono anche sbattuto a commentarla :-)
ciao
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)