180 likes | 328 Views
PROGRAMMA. INPUT + DATI. INPUT. PROGRAMMA CARICAMENTO DATI. FILE DATI. PROGRAMMA. OUTPUT. FILE TESTO. OUTPUT. FILE TESTO.
E N D
PROGRAMMA INPUT + DATI INPUT PROGRAMMA CARICAMENTO DATI FILE DATI PROGRAMMA OUTPUT FILE TESTO OUTPUT
FILE TESTO 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. - Contiene caratteri leggibili - E’ etichettato con un nome - Ha un indirizzo sull’unità di memoria di massa Esempio La vispa Teresa avea tra l’erbetta a volo sorpresa gentil 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 !!!!
assign ( , assign (IdentificatoreFile,NomeFile) ) APERTURA DI UN FILE procedure Identificatore file Nome file assign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT'); PROGRAM EcoFile(output, ProvaF); VAR ProvaF : text; } BEGIN assign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT'); ………….. END.
procedure Identificatore file reset ( VAX e standard Pascal reset(Testo) reset (IdentificatoreFile) TURBO PASCAL assign(Infile,’TESTO.txt’) reset(Infile,’TESTO.txt’) ) APPLE PASCAL reset(Infile,’TESTO.txt’) reset( ProvaF); L a v i s p a T LETTURA DI UN FILE Un file non può essere letto e scritto contemporaneamente. La procedura reset prepara il file alla lettura. La chiamata alla procedura reset può variare da dialetto a dialetto. prepara file per la lettura
FILE TESTO L a v i s p a T v eoln a a e e a s e r t r a .. .. .. eoln eoln eof eoln eoln 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) Esempio La vispa Teresa avea tra l’erbetta a volo sorpresa gentil farfalletta Struttura del file testo
a eoln eoln eoln(Prolett) FALSE L a v i s p a readln(Prolett,Carattere) a eoln eof eoln(Prolett) TRUE L a a eof Posizione e contenuto della finestra di lettura dopo il reset(ProvaF). Posizione e contenuto della finestra di lettura dopo readln(ProLett,Carattere); write(Carattere); L
Terminata la lettura di una riga bisogna andare a capo PROGRAM ProvaFiles(input,output,ProLett); {legge dal file TESTO i caratteri uno alla volta e li mostra a video} VAR ProLett: 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; readln END.
input 1° 2° 3° 4° 5° 6° Valori eoln False False False False False False True T Finestra input T eoln e a e s r eoln e a s e r Ch letto ? T e a e s r T e a e s r Ch mostrato
Identificatore file rewrite ( rewrite (IdentificatoreFile) ) rewrite( ProvaF); SCRITTURA DI UN FILE La procedura rewrite prepara il file alla lettura. 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. Quando si scrive un file si presuppone sempre di comnciare dall’inizio del file. Se questo avesse già un contenuto questo verrebbe sovrascritto. prepara file per la scrittura
close ( procedure Identificatore file ) close (IdentificatoreFile) close( Prodat); SCRITTURA DI UN FILE Si può copiare un file in un altro anche leggendo un rigo alla volta 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} CONST LungMax=80; {massima lunghezza permessa alle stringhe } TYPE Stringa=STRING[LungMax]; {dipende dal dialetto} VAR ProInput,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 '); readln END.
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.
read mode buffer L a v v i i s s p p a a invio write mode Finestra di lettura i eoln L a v i s p a eoln v Variabile NomeFile InFile Variabile NomeFile OutFile alla elaborazione ALGORITMI PER IL TRATTAMENTO DI FILE TESTO
PROGRAM MostraFile(VispaTeresa, output); {mostra il contenuto di un file su monitor} VAR VispaTeresa: text; BEGIN assign(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) END END;
CREAZIONE DI UN FILE TESTO DA TASTIERA PROGRAM Digitato(input, output, FileDigitato); {crea un file da tastiera e poi lo mostra } VAR FileDigitato: text; Risposta : char; {per rispondere al quesito} PROCEDURE Istruzioni; BEGIN writeln(‘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;
Senza questa istruzione se c’è un altro read verrà letto un blank. readln(UnFile) {azzera la finestra di lettura} 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 quando battiamo 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) DO read(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)
ESEMPIO Notare che abbiamo usato il file di default input. 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.’); Trovare il primo carattere diverso da blank Leggere caratteri fin quando non si incontra eoln Carattere ‘ ‘; IF NOT eoln(UnFile) THEN read(UnFile, Carattere); ELSE Carattere ‘ ‘ Carattere ‘ ‘; WHILE (Carattere =‘ ‘) AND NOT eoln(UnFile) DO read(UnFile, Carattere); readln;