FILE TESTO
description
Transcript of FILE TESTO
FILE TESTO
OUTPUTINPUT
+DATI
PROGRAMMA
OUTPUTINPUT
PROGRAMMA
PROGRAMMACARICAMENTO
DATIFILE DATI
FILE TESTO
- Contiene caratteri leggibili- E’ etichettato con un nome- Ha un indirizzo sull’unità di memoria di massa
I File testo si possono caricare e modificare con un Editor ad Es. quello del Turbo Pascal, il Word, Note Pad purchè vengano salvati come file testo (suffisso .txt), o con un appropriato programma Pascal.
EsempioLa vispa Teresaavea tra l’erbettaa volo sorpresagentil farfalletta
In ogni programma Pascal ogni file è identificato attraverso una variabile.
PROGRAM EcoFile(output, InFile);VAR
Infile : text;Carattere: char; {usato per estrarre i caratteri dal testo}
BEGIN…………..END.
UN FILE TESTO NON SI COMPILA PERCHE’ NON E’ UN PROGRAMMA !!!!
APERTURA DI UN FILE
assign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT');
assign (IdentificatoreFile,NomeFile)
PROGRAM EcoFile(output, ProvaF);VAR
ProvaF : text;}
BEGINassign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT');…………..END.
assign ( )Nome fileIdentificatorefile
procedure
,
Un file non può essere letto e scritto contemporaneamente.
La chiamata alla procedura reset può variare da dialetto a dialetto.
LETTURA DI UN FILE
La procedura reset prepara il file alla lettura.
reset (IdentificatoreFile)
reset ( )Identificatorefile
procedure
reset( ProvaF);
prepara file per la lettura
L a v i s p a T
VAX e standard Pascalreset(Testo)
TURBO PASCALassign(Infile,’TESTO.txt’)reset(Infile,’TESTO.txt’)
APPLE PASCALreset(Infile,’TESTO.txt’)
FILE TESTO
Il file testo (.txt) è caratterizzato dall’avere un carattere speciale quando termina un rigo, detto: eoln (end-of-line); e da un carattere speciale che indica la fine del file detto: eof (end-of-file)
EsempioLa vispa Teresaavea tra l’erbettaa volo sorpresagentil farfalletta
Struttura del file testo
L a v i s p a T
a eoln a s e r e
a
v
t r .. .. ..
eof
eoln
eoln
eoln
ea
eoln
L a v i s p a
L
Posizione e contenuto della finestradi lettura dopo il reset(ProvaF).
a Posizione e contenuto della finestradi lettura dopo readln(ProLett,Carattere);
write(Carattere);
L
a
eofeoln eolna
eoln
readln(Prolett,Carattere) a
eoln(Prolett) FALSE
eofeoln(Prolett) TRUE
PROGRAM ProvaFiles(input,output,ProLett);{legge dal file TESTO i caratteri uno alla volta e li mostra a video}
VARProLett: text;Carattere: char;
BEGIN assign(ProLett,'C:\TP\ESEMPI\TESTO.TXT'); reset(ProLett); WHILE NOT eof(ProLett) DO BEGIN WHILE NOT eoln(ProLett) DO BEGIN read(ProLett,Carattere); write(Carattere) END; readln(ProLett); writeln; END; readlnEND.
Terminata la lettura di una rigabisogna andare a capo
T eolnasere
Valori
Finestra input
eoln
Ch letto
Ch mostrato
input
False
T
?
6°
True
eoln
a
a
5°
False
a
s
s
4°
False
s
e
e
3°
False
e
r
r
2°
False
r
e
e
1°
False
e
T
T
La chiamata alla procedura rewrite può variare da dialetto a dialetto e risulta operativa solo se il file aperto cui essa fa riferimento non contiene alcun carattere.
SCRITTURA DI UN FILE
La procedura rewrite prepara il file alla lettura.
Quando si scrive un file si presuppone sempre di comnciare dall’inizio del file. Se questo avesse già un contenuto questo verrebbe sovrascritto.
rewrite (IdentificatoreFile)
Identificatorefile
rewrite ( )
rewrite( ProvaF);
prepara file per la scrittura
SCRITTURA DI UN FILE
Si può copiare un file in un altro anche leggendo un rigo alla volta
close (IdentificatoreFile)
close ( )Identificatorefile
procedure
close( Prodat);
CHIUSURA DI UN FILE
Dopo avere scritto un file è necessario chiuderlo.
La procedura close(InFile) chiude il file identificato dalla variabile InFile
PROGRAM ProvaFiles(input,output,ProInput,ProOut);{esempio di lettura e scrittura di files}{legge dal file TESTO una stringa Stringa e la scrive su COPIA}
CONSTLungMax=80; {massima lunghezza permessa alle stringhe }
TYPE Stringa=STRING[LungMax]; {dipende dal dialetto}VARProInput,ProOut: text; {identificatori dei file di lettura e scrittura}Rigo: Stringa; {linea del testo letta e riscritta}
BEGIN assign(ProInput,'C:\TP\ESEMPI\TESTO.TXT'); assign(ProOut,'C:\TP\ESEMPI\COPIA.TXT'); reset(ProInput); {prepara file per la lettura} rewrite(ProOut); {prepara file per la scrittura} WHILE NOT eof(ProInput) DO {verifica che non sia finito il file} BEGIN readln(ProInput,Rigo); {leggi il rigo} writeln(ProOut,Rigo) {scrivi il rigo} END;close(ProInput); {chiudi il file di input}close(ProOut); {chiudi il file di output}writeln('File Duplicato ');readlnEND.
In lettura i caratteri vengono letti uno alla volta (read) o a gruppi (readln) e la finestra di lettura si comporta come prima descritto.
In scrittura i caratteri letti vengono messi in un buffer del file rappresentato dal nome della variabile del file. Il buffer contiene una riga del testo, cioè dall’inizio fino a <eoln>. Con write leggiamo carattere per carattere e lo aggiungiamo nel buffer. Con writeln prima carichiamo il buffer con una riga di testo e poi scarichiamo il suo contenuto sul file di uscita aggiungendo automaticamente alla fine un <eol>.A questo punto il buffer si riempie di spazi vuoti ed è pronto a continuare la lettura.
Con un read o readln la finestra di lettura fa sempre un passo avanti.
Con un write o writeln si aggiunge sempre un carattere al buffer.
ALGORITMI PER IL TRATTAMENTO DI FILE TESTO
write mode v i s p a bufferinvio
Variabile NomeFileOutFile
eolnL a v i s p aeoln
read mode
L a v i s p a
iFinestra di lettura
Variabile NomeFileInFile
v
alla elaborazione
PROGRAM MostraFile(VispaTeresa, output);{mostra il contenuto di un file su monitor}VARVispaTeresa: text;
BEGINassign(VispaTeresa,’C:\TP\ESEMPI\TESTO.txt’)reset(VispaTeresa);CopiaFile(VispaTeresa,output);close(VispaTeresa);END.
PROCEDURE CopiaFile(VAR InFile,OutFile:text);{i file InFile e OutFile sono già stati preparati per essere
letti e scritti}VAR Carattere: char; {carattere da leggere da InFile}BEGIN WHILE NOT eof(InFile) DO {verifica che non sia finito il file} BEGIN
WHILE NOT eoln(InFile) DO BEGIN read(InFile,Carattere); {leggi il carattere} write(OutFile,Carattere) {scrivi il carattere} END; readln(InFile); writeln(OutFile) ENDEND;
CREAZIONE DI UN FILE TESTO DA TASTIERAPROGRAM Digitato(input, output, FileDigitato);{crea un file da tastiera e poi lo mostra }VARFileDigitato: text;Risposta : char; {per rispondere al quesito}PROCEDURE Istruzioni;BEGINwriteln(‘Alla fine della digitazione premere CONTROL Z per chiudere il file)END;PROCEDURE CopiaFile(VAR InFile,OutFile: text);BEGIN ********************* END;
{************* MAIN ********************}BEGIN assign(FileDigitato,’C:/TP/ESEMPI/TESDIG.TXT); rewrite(FileDigitato); CopiaFile(input, FileDigitato); close(FileDigitato); reset(input); {necessario per alcuni dialetti} write(‘Copia eseguita. Vuoi rivedere il testo ? S/N’); readln(Risposta); IF Risposta IN[‘S’,’s’] THEN BEGIN
writeln;reset(FileDigitato);CopiaFile(FileDigitato,output)
END;END.
COPIA DI DUE FILE IN UNO
PROGRAM CopiaDueFile(output;Teresa, Giacomo, TerGiac);VAR
Teresa, Giacomo, TerGiac: text;PROCEDURE CopiaFile(VAR InFile, OutFile: text);BEGIN*******************END;BEGIN
assign(Teresa,’C/TP/ESEMPI/TESTO1.txt’);assign(Giacomo,’C/TP/ESEMPI/TESTO2.txt’);assign(TerGiac,’C/TP/ESEMPI/TESTO3.txt’);rewrite(TerGiac);reset(Teresa);CopiaFile(Teresa,TerGiac);writeln(TerGiac);reset(Giacomo);CopiaFile(Giacomo,TerGiac); writeln(‘ FINE’);close(TerGiac)
END.
LETTURA DEL NOME DEL FILE DURANTE L’ELABORAZIONE
PROCEDURE ChiamaFile(VAR NomeFile: StringType; VAR UnFile: text);BEGIN
write(‘ Dammi il nome del file da elaborare: ‘);readln(NomeFile);assign(UnFile, NomeFile)
END;
USO DELLA FUNZIONE eoln
Il valore di default della funzione eoln è il file input, cioè se nonè dichiarato il nome del file, allora la funzione eoln sarà vera quandobattiamo il tasto invio. In questo caso sia per eoln che per read o readln non è necessario mettere il parametro relativo al file.
Lettura di un rigo di un file carattere per carattere
WHILE NOT eoln(UnFile) DOread(UnFile, Carattere)elabora carattere
Alla fine del loop tutti i caratteri del rigo sono stati letti e il carattere eolnè il nuovo candidato ad essere letto. Questo provoca la lettura di uno spazio che in realtà non esiste. Per evitare questo si pone readln(UnFile)
readln(UnFile) {azzera la finestra di lettura}
Senza questa istruzione se c’è un altroread verrà letto un blank.
ESEMPIO
Contare il numero di caratteri digitati e il numero degli spazi.ContaSpazi:=0;ContaCaratteri:=0;WHILE NOT eoln DO
BEGIN read(Carattere); ContaCaratteri:=ContaCaratteri+1;
IF Carattere = ‘ ‘ THEN ContaSpazi:=ContaSpazi+1;
END;readln;write(‘Il numero di caratteri totali digitati e’’’,ContaCaratteri,
‘di cui ’,ContaSpazi,’ spazi.’);
Notare che abbiamo usato il file didefault input.
Leggere caratteri fin quando non si incontra eoln
Carattere ‘ ‘;IF NOT eoln(UnFile) THEN
read(UnFile, Carattere);ELSE Carattere ‘ ‘
Trovare il primo carattere diverso da blank
Carattere ‘ ‘;WHILE (Carattere =‘ ‘) AND NOT eoln(UnFile) DO
read(UnFile, Carattere);
readln;