Laboratorio di Programmazione Laurea in Informatica A.A. 2000/2001 Docente: A. Lanza I file esterni Assign flessibile I file di tipo text I/O bufferizzato La procedura page Creazione, Stampa, Travaso, Conteggio delle linee di un file di tipo text Editazione a cura di Aprile S. e D Onghia V. 1
I FILE ESTERNI I file esterni esistono sia prima del programma ( da cui sono ispezionati ) che dopo (nel caso siano generati dal programma stesso ) : sono permanenti. La intestazione di programma deve contenere la lista dei file esterni usati. La connessione fra il nome del file logico ( quello della variabile file che compare allo interno del programma ) e il nome del file fisico ( nome del file su disco) è dipendente dall implementazione, ossia non è standard. < parametri di programma > : : = < identificatore > < parametri di programma >, < identificatore > I parametri del programma sono le variabili file e rappresentano gli argomenti (dati in ingresso ) ed i risultati (uscita ) della elaborazione, essi denotano entità che esistono esternamente al programma e attraverso i quali il programma comunica con l ambiente (lo si può considerare come una specie di procedura chiamata dal sistema operativo ). Esempi di intestazione di programma PROGRAM prova ; PROGRAM prova ( output ) ; PROGRAM prova ( input, output ) ; PROGRAM prova ( input, output, f ) ; PROGRAM prova ( input, output, f, g ) ; 2
La intestazione di un programma è la INTERFACCIA di comunicazione con l esterno. PROGRAM prova ( input, output, dati ) Serve a specificare - l inizio del programma - il nome del programma - quali e quanti file vengono usati si tratta di file che sono già stati creati in precedenza (conterranno dati di ingresso per il programma ) oppure che dovranno essere creati dal programma (costituiscono risultati del programma ). E consigliabile controllare tramite una DIR la loro effettiva presenza sul supporto di memoria esterna. 3
Per assegnare il nome fisico di un file da associare alla variabile FILE si può usare l ASSIGN : - all interno del programma Pascal - prima della inizializzazione RESET/REWRITE relativa a quei file assign ( nomevariabilefile, stringa ) dove stringa deve essere un nome di file del DOS. ESEMPIO assign ( f, b: archivio ) sul dischetto in B: ci sarà un file di nome archivio senza estensione OPPURE (dipende dal File System) si può specificare il nome quando si manda in run il programma f: b:archivio PRIMA DI RIUSARE UN FILE BISOGNA CHIUDERLO CON LA CLOSE Close ( nomefile ) chiusura del file nomefile NON E STANDARD SPECIFICA CHE SONO TERMINATE LE OPERAZIONI DI SCRITTURA DEL FILE e ha come effetto l aggiornamento nel file fisico esterno a cui la variabile file è stata associata mediante l ASSIGN, se è un file di uscita sarà scritto il carattere < eof > alla fine del file. Per leggere il contenuto di un file creato in precedenza nello stesso programma bisogna prima chiudere il file e poi aprirlo in lettura 4
Si può fare un ASSIGN flessibile nel modo seguente: PROGRAM esempio ( input, output, a, b ) ; VAR a, b : file del programma Nomea, nomeb : string [ 12 ] Packed array [ 1.12 ] of char ; Write ( nome del file sorgente? ) Readln ( nomea ) ; write ( nome del file di destinazione? ) readln ( nomeb ) ; ASSIGN ( a, nomea ) ; ASSIGN ( b, nomeb ) ; xxxxxxxx.xxx 8 1 3 = 12 caratteri (ricordiamo che STRING non è standard!!) In TURBO se usiamo la stringa nulla come nome nell ASSIGN : tastiera Generalmente in ambiente UNIX o MacIntosh le procedure reset e rewrite sono estese per consentire anche la connessione all interno del main ES. rewrite ( output, DATI.OUT ) 5
TEXTFILE TEXT è un tipo di file predefinito in Pascal. Le componenti di un file di tipo TEXT sono i caratteri del Pascal ( tipo char ) ed un carattere speciale detto marcatore di fine linea ( end of line mark ). Il marcatore di fine linea permette di raggruppare sequenze di caratteri in linee. ESEMPIO VAR infile, outfile : text e VAR infile, outfile : FILE OF char differiscono, poichè text è organizzato in linee. ( I file standard input ed output sono file di tipo text ) Oss. La variabile buffer di qualsiasi file di tipo text è di tipo char 6
ESEMPIO DI TEXTFILE l a v i s p a t e r e s a eoln a v e a A eoln eof 1 linea fine file I textfile sono utilizzati per realizzare la COMUNICAZIONE fra i programmi e l esterno Possiamo usare un file text che contenga i dati di ingresso per il nostro programma : il nostro programma dovrà leggere i dati da tale file invece che dalla tastiera. Possiamo far scrivere i risultati di un nostro programma su un file text invece che sullo schermo : il file con i risultati potrà essere stampato in seguito. 7
Su un file di tipo text sono applicabili : - reset, rewrite, get (non in TURBO), put (non in TURBO), read, write, eof e writeln (nomefile) appende un marcatore di fine linea al file nomefile : = chr(13) (ascii) put ( nomefile ) readln ( nomefile) ignora i caratteri del file fino a trovare un marcatore di fine linea e si posiziona sulla nuova linea while not eoln ( nomefile) do get ( nomefile ) get ( nomefile ) eoln ( nomefile) funzione booleana produce il valore TRUE se ci si trova su un marcatore di fine linea, altrimenti FALSE 8
I file standard input e output - sono di tipo text - non è necessario dichiararli nella VAR - per convenzione ad input si applicano operazioni di lettura ( get, read, readln ) ad output di scrittura ( put, write, writeln ) - la reset e la rewrite sono implicitamente applicate - tutte le procedure e funzioni standard applicabili ai files in Pascal assumono implicitamente input o output come files su cui operare qualora venga omesso il nome del file. VAR input, output : text due variabili file Predichiarate Destinate alla Comunicazione Connessi generalmente alla tastiera e al video 9
Le operazioni di ingresso e di uscita non sono altro che operazioni di lettura ( da input ) e operazioni di generazione ( di output ) di file di testo implicitamente definiti nel programma VAR x : char ; Begin read ( x ) x: input ; equivale a read ( input, x ) get ( input ) si può omettere End Begin write ( x ) input : = x ; equivale a write ( output, x ) put ( output ) si può omettere End 10
tastiera input / output 3 buffer input tasto premuto dall utente il programma attende che l utente introduca il valore per num da tastiera cioè da input Read ( num ) PROGRAMMA lettura del buffer effetto : num 3 PROGRAMMA m = 18 ; write ( m ) Scrittura sul file output 18 BUFFER OUTPUT 18 VIDEO Effetto : visualizza il valore di m 11
I numeri, sia di tipo integer che real, non possono essere direttamente letti e scritti sui file di testo ( vale per qualunque textfile ) senza operazioni di CONVERSIONE! Le operazioni di conversione sono nascoste nelle procedure read e write! VAR x : = integer read ( x ) 1 2 7 Convertito rappr. interna x l elemento di un file input è un carattere write ( x ) rappr. interna Convertito in caratteri x scrittura sul file standard output 12
READ ( è una procedura predefinita ) L effetto di read ( v) dipende dal tipo di v : si preleve dal file input una sequenza di caratteri corrispondente alla sintassi del tipo associato alla variabile Read (v, v,.. v(n) ) È equivalente a Begin Read ( v ) ; Read ( v ) ;.. Read ( v(n) ) ; End v deve essere stata definita; il tipo di v può essere char, integer, real READLN è equivalente a read seguita dall andata a capo 13
VAR v : integer ; read ( v ) implica la lettura da tastiera di una sequenza di caratteri che costituiscono un intero con segno e l assegnamento a v del valore intero corrispondente. Il valore deve essere compatibile per l assegnamento rispetto al tipo di v. Eventuali b prima del numero sono saltati. Se sono trovati caratteri inattesi ( ad esempio la virgola o una lettera ) si ha un errore b b b + 1450 v 1450 read ( num1, num2 ) separare mediante b i numeri interi o reali b b 14 b 96 num1 14 num2 96 quanti b voglio read ( c ) VAR c : char ; viene letto 1 carattere e assegnato ad a c read ( r ) VAR r : real ; b b - 380.39 b r - 380.39 14
WRITE Possono essere scritti numeri interi numeri reali caratteri stringhe valori booleani il formato con cui una quantità viene scritta può essere specificato attraverso l ampiezza del campo e, per i numeri reali, la lunghezza della parte frazionaria. write ( pippo : 8 ) b b b pippo write ( 3 > 20 ) write ( ciao ) false ciao write ( alfa : 6 : 2 ) - 82.50 WRITELN : andare a capo file output associato al video 15
I/O Bufferizzato I dati immessi da tastiera sono memorizzati temporaneamente in un buffer fino a che viene premuto il tasto ENTER. Fino a che non vieni premuto il tasto enter, i dati possono essere editati nel buffer di input tramite il tasto per cancellare caratteri e reimmetterli. Battere enter equivale ad inserire il carattere < eoln > nel buffer di input e il programma può cominciare ad elaborare la line di dati. Analogamente per la visualizzazione dei risultati sullo schermo Writeln = muove il cursore all inizio della linea Successiva sullo schermo Quando si chiude ( close ) un file di output qualunque carattere rimasto nel suo buffer viene scritto nel file assieme all < eof >. 16
PROCEDURA PAGE È stata inclusa nel Pascal standard secondo l ISO page ( nomefiletext ) causa un azione definita dalla implementazione sul file text andare ad una nuova pagina il file deve essere stato aperto come file di uscita 17
PROCEDURE createsto ( VAR testo : text ) ; VAR car : char ; writeln ( inserire il testo ; per terminare ^ E ) ; rewrite ( testo); WHILE NOT eof DO WHILE NOT eoln DO END read ( car ) ; write ( testo, car ) ; END writeln ( testo ) ; readln END ; ( * creastesto * ) 18
PROCEDURE stampa ( VAR t : text ) ; VAR car : char ; Reset ( t ) WHILE NOT eof ( t ) DO WHILE NOT eoln( t ) DO readln ( t ) ; writeln END END ; ( * stampa * ) read ( t, car ) ; write ( car ) END ; 19
PROCEDURE travaso ( VAR sorgente, destinazione : text ) ; VAR ch : char ; reset ( sorgente ) ; rewrite ( destinazione ) ; WHILE NOT eof ( sorgente ) DO WHILE NOT eoln ( sorgente ) DO read ( sorgente, ch ) ; write ( destinazione, ch ) END ; writeln ( destinazione ) ; readln ( sorgente ) END END ( * travaso * ) Simile a copia di file nontext 20
CONTEGGIO DELLE LINEE DI UN FILE DI TIPO TEXT PROCEDURE contalinee ( VAR testo : text ; VAR nlinee : integer ) ; Reset ( testo ) ; nlinee : = 0 ; WHILE NOT eof ( testo ) DO END WHILE NOT eoln ( testo ) DO get ( testo ) Readln ( testo ) ; nlinee : = nlinee + 1 END N.B. E perfettamente legale mescolare l uso della get / put con read / write La suddivisione in linee influenza la struttura dei programmi che elaborano file di testo che avranno una struttura ciclica a più livelli ( per elaborare le singole linee e per elaborare i singoli caratteri di una linea ) 21