Newsgroup: it.comp.lang.pascal
Titolo: Trova in file


Ti dorvresti fare un bel programmino.
Va be' te lo faccio io.
Program	trova_stringa;
var	n,s,sub:string;
	f:text;
	trovata:boolean;
begin
	write('Nome file: ');
	readln(n);
	writeln;
	write('Stringa da ricercare: ');
	readln(sub);
	trovata:=false;	
	assign(f,n);
	reset(f);
	while (not eof(f) and (not trovata)) do begin
		readln(f,s);
		trovata:=pos(sub,s)<>0
	end;
	close(f);
	writeln;
	if trovata then
		writeln('SI la stringa e contenuta nel file')
	else
		writeln('NO la stringa non e contenuta');
	writeln('CIAO');
end.
Saluti,   Fabio
fabi...@rocketmail.com

come devo fare?
Per poter modificare il file questo deve essere riscritto.
Il file in questione viene rinominato con un nuovo nome con estensione
.bak. L'eventuale presenza di questo file con estensione .bak viene
risolta eliminandolo con l'utilizzo della procedura elimina_file.
Quindi il programma mentre procede leggendo il file alla ricerca della
stringa intanto ne fa una copia fino al punto in cui la trova. Una
volta trovata, questa viene sostituita e poi si procede a finire la
copia del file.
Il vecchio file e' ripristinabile utilizzando la versione .bak
Program	trova_e_sostituisci_stringa;
var	n1,n2,s,sub1,sub2:string;
	f1,f2:text;
	i,p:longint;
procedure  elimina_file(n:string);
var	 f:text;
begin
	assign(f,n);
	rewrite(f);
	close(f);
	erase(f)
end;
begin
	writeln;
	write('Nome file: ');
	readln(n1);
	n2:=copy(n1,1,pos('.',n1)-1)+'.bak';
	writeln;
	write('Stringa da ricercare: ');
	readln(sub1);
	write('Sostituire la tringa con: ');
	readln(sub2);
	elimina_file(n2);
	assign(f1,n1);
	rename(f1,n2);
	reset(f1);
	assign(f2,n1);
	rewrite(f2);
	i:=0;
	while not eof(f1) do begin
		readln(f1,s);
		p:=pos(sub1,s);
		if p<>0 then begin
			delete(s,p,length(sub1));
			insert(sub2,s,p);
			inc(i)
		end;
		writeln(f2,s)
	end;
	close(f1);
	close(f2);
	writeln('OK  ',i, ' sostituzioni eseguite')
end.
Saluti,  Fabio.
fabi...@rocketmail.com

procedure  elimina_file(n:string);
scusate l'ignoranza,ma non capisco questi tipi di dato usati per
definire le variabili n1,n2,f1,f2,i,p.......
Sto studiando il Pascal sul Welsh-Elder e non ho mai incontrato 
il tipo longint o quello text.
La stringa invece l'ho studiata,ma non come un tipo di
dato.......bensì come un paked array.
Mi aiutate,per favore????
Grazie. 
______________________________
e-mail:  
Aur...@hotmail.com
 
tol...@reteitalia.net
ICQ:     16005054


Questi sono i tipi dei numeri interi del Pascal
Type                          Range                     Size
---------------------------------------------------------------
Shortint                    -128..127                      8-bit
Integer                -32768..32767                  6-bit
Longint    -
2147483648
..
2147483647
    32-bit
Byte                               0..255                      8-bit
Word                             0..65535               16-bit
Per quanto riguarda il Packed array in Pascal non serve perche' il
tipo STRING fa tutto da se.
Il tipo STRING e' una stringa che puo' essere lunga fino ad un massimo
di 255 caratteri ed occupa sempre in memoria 255 byte.
Quindi se io definisco S:String posso assegnare ad S per esempio
'abcd' o leggere stringhe da tastiera tramite READLN(S).
Il Packed array non serve perche' tramite S[i] posso vedere quale e'
l'i-esimo carattere della stringa S, o lo posso modificare facendo
S[2]:='z'
Per le varie operazioni sulle stringhe guardati nell'help le
istruzioni: STR, VAL, COPY, POS, LENGHT, DELETE, INSERT.
Come avevo detto prima una variabile di tipo STRING ciuccia ben 255
byte, quindi occhio a dichiarare strutture del tipo:
v:array[1..1000] of string
perche' richiederebbe una memoria libera solo per il dato di 255Kb che
non hai. Di devi limitare per esempio dichiarando
v:array[1..1000] of string[20]
cioe' un vettore di 1000 stringhe che hanno pero' una lunghezza di 20
caratteri.
Per quanto riguarda  TEXT questo e' un tipo per i file.
Questo ti permette di trattare il file come un testo e quindi un volta
aperto con i comandi RESET, APPEND e REWRITE, puoi leggere e scrivere
stringhe con le istruzioni READLN(f,s) o WRITELN(f,s). Okkio non vanno
bene READ o WRITE.
Il difetto di questo tipo di file (grosso ma logico) e' che non puoi
andare avanti o indietro posizionandoti dove vuoi utilizzando
l'istruzione SEEK, come invece si puo' fare con file di tipo BYTE,
CHAR o di records. Quindi quando apri un file di tipo TEXT lo puoi o
solo leggere o solo scrivere.
Spero di essere stato abbastanza chiaro.
CIAO,   Fabio
fabi...@rocketmail.com

CIAO,   Fabio
.........chiarissimo.
GRAZIE 1000 !!!!!


di 255 caratteri ed occupa sempre in memoria 255 byte.
Giusto per la precisione, ne occupa 256: il primo byte consiste in un
Byte (intendo il tipo di dato intero) contenente la lunghezza della
stringa.
Ciao,
DjM / Digital Things
aka Mauro Molinari
Internet e-mails: 
=> 
djm...@geocities.com
 (music)
=> 
maur...@tin.it
 (personal/other)
ICQ #: 10379016
Digital Things Home Page:
=> 
http://space.tin.it/musica/gvettora
=> 
http://www.geocities.com//SiliconValley/Bay/8251
=> 
http://members.tripod.com/~DjM_DiT
=> 
http://members.xoom.com/DjM_DiT
*** To send me an e-mail, put the correct address into "to" field.
*** Per mandarmi una e-mail, metti l'indirizzo corretto nel campo "a"..

>

ma pensa te....
Mitico il vecchio VAX della Digital. Un vero gesso.
Io ci lavoravo dieci anni fa quando andavo a scuola all'ITIS. E li
gia' ce l'avevano da qualche anno e l'avevano pure preso usato.
Confermo tutto. Si inchiodava perennemente. Avevamo l'editor in rete,
un vero strazio. Poi la cosa e' cambiata (in peggio) ci hanno aggiunto
degli Apple 2e per fare l'editor e da collegare in rete per compilare.
L'integer a 64-bit mi sebra che si chiamava Doubleprecision ma non ne
sono sicuro. Io, per abitudine, ho continuato ancora per qualche anno
a mettere (Input,Output) anche sul Turbopascal.
Adesso mi viene in mente che quando si leggevano i files, dopo le READ
bisognava usare anche la GET e per scrivere dopo la WRITE bisognava
mettere la PUT (come da standard Pascal). Nel TP queste due istruzioni
sono presenti ma dovrebbero servire per altra roba.
CIAO,   Fabio
fabi...@rocketmail.com