FILE TESTO INPUT + DATI PROGRAMMA CARICAMENTO DATI PROGRAMMA FILE DATI PROGRAMMA INPUT OUTPUT OUTPUT 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. 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 !!!! APERTURA DI UN FILE procedure assign ( Identificatore file , Nome file ) assign (IdentificatoreFile,NomeFile) assign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT'); PROGRAM EcoFile(output, ProvaF); VAR ProvaF : text; } BEGIN assign( ProvaF, ’C:\TP\ESEMPI\TESTO.TXT'); ………….. END. 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. procedure Identificatore file ( reset VAX e standard Pascal reset(Testo) TURBO PASCAL assign(Infile,’TESTO.txt’) reset(Infile,’TESTO.txt’) ) prepara file per la lettura reset (IdentificatoreFile) APPLE PASCAL reset(Infile,’TESTO.txt’) reset( ProvaF); L a v i s p a T 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) Esempio La vispa Teresa avea tra l’erbetta a volo sorpresa gentil farfalletta L a a e Struttura del file testo v v t a r a i s p a eoln a s e .. .. T r .. e eoln eoln eoln eoln eof L L a a v i s p a 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 a eoln eoln(Prolett) readln(Prolett,Carattere) eoln(Prolett) eoln eof FALSE a TRUE a eoln eof 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; Terminata la lettura di una riga END; bisogna andare a capo readln END. T e r e s a eoln Valori input 1° 2° 3° 4° 5° 6° eoln False False False False False False True Finestra input T e r e s a eoln Ch letto ? T e r e s a T e r e s a Ch mostrato 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. rewrite ( Identificatore file ) rewrite (IdentificatoreFile) prepara file per la scrittura rewrite( ProvaF); SCRITTURA DI UN FILE procedure close Identificatore file ( close (IdentificatoreFile) ) Si può copiare un file in un altro anche leggendo un rigo alla volta 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} 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. ALGORITMI PER IL TRATTAMENTO DI FILE TESTO read mode L a v i s p a Finestra di lettura i v Variabile NomeFile InFile alla elaborazione write mode L a eoln v i s p a v i s p a invio buffer eoln Variabile NomeFile OutFile PROGRAM MostraFile(VispaTeresa, output); {mostra il contenuto di un file su monitor} VAR VispaTeresa: text; 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; BEGIN assign(VispaTeresa,’C:\TP\ESEMPI\TESTO.txt’) reset(VispaTeresa); CopiaFile(VispaTeresa,output); close(VispaTeresa); 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 {************* MAIN ********************} ********************* BEGIN END; 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); LETTURA DEL NOME DEL FILE writeln(‘ FINE’); DURANTE L’ELABORAZIONE close(TerGiac) END. 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 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 Senza questa istruzione se c’è un altro read verrà letto un blank. WHILE NOT eoln(UnFile) DO read(UnFile, Carattere) elabora carattere readln(UnFile) {azzera la finestra di lettura} 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 Contare il numero di caratteri digitati e il numero degli spazi. ContaSpazi:=0; Notare che abbiamo usato il file di ContaCaratteri:=0; default input. 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.’); 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;