I File di testo in Pascal Prof. Carla Fanchin LS Tron – ITCG Pasini
I file I file sono sequenze di bit memorizzate in memoria di massa (ad es. su disco fisso) In quanto tali hanno carattere permanente Ogni file ha un Nome ed un Estensione (solitamente di tre caratteri) che ne specifica la tipologia (es: .PAS file sorgente Pascal)
Come si creano i file ? I file vengono generati da varie applicazioni: ad es. Word genera file di tipo .DOC, Excel genera file di tipo .XLS e così via. Anche gli ambienti integrati di sviluppo (IDE) come il Dev Pascal creano file: ad es. quando si salva il programma sorgente, viene creato un file .PAS.
File creati da programmi Anche un programma Pascal, una volta mandato in esecuzione, può creare un file. Ad esempio un file di testo I file di testo si possono aprire poi con il Blocco Note Un file di testo è formato da un insieme di RIGHE
Il Formato dei file di testo I file di testo contengono alcuni caratteri speciali: Al termine di ogni riga ci sono 2 caratteri ASCII non visibili: CR e LF CR=Carriage Return (ASCII 13) LF=Line Feed (ASCII 10) Al termine dell’ultima riga c’è anche un terzo carattere: EOF (End Of File) (ASCII 26 o CTRL-Z) L’inizio del file viene poi indicato con BOF (Begin Of File)
Utilizzo dei file di testo VAR F:TEXT; Occorre dichiarare una variabile (con un nome qualsiasi, in questo caso F, di tipo TEXT F sarà il NOME LOGICO con il quale il file verrà trattato nel programma Poiché però il file verrà memorizzato effettivamente su memoria di massa, occorrerà anche ASSOCIARLO ad un file vero e proprio
Associazione del nome logico al nome fisico Si fa tramite il comando: ASSIGN(F, ‘stringaPercorsoENome’) Es: ASSIGN (F, ‘C:\PASCAL\FILE\POESIA.TXT’) NB:NON mettete spazi o caratteri strani nei nomi dei file o nei percorsi !!!!!!!!!!!!!!!! Ogni volta che tratteremo, da programma il file di nome F, in realtà lavoreremo sul file POESIA.TXT che si trova nella sottocartella FILE della cartella PASCAL del disco fisso
Creazione del file (Poesia ‘Il sabato del villaggio’ di G.Leopardi’) Il file va aperto in scrittura (NB distruttiva !) REWRITE(F) Vanno poi scritte una o più righe WRITELN(F, ‘stringa’) es. WRITELN(F, ‘La donzelletta vien dalla campagna’) WRITELN(F, ‘in sul calar del sole,’) E così via per le altre righe: col suo fascio dell'erba; e reca in mano un mazzolin di rose e viole, onde, siccome suole, ornare ella si appresta dimani, al dí di festa, il petto e il crine. Alla file il File va chiuso (aggiunta del carattere EOF) CLOSE(F)
Precisazione La stringa che scrivo in ogni riga non deve essere necessariamente una costante (tra apici); potrebbe essere anche una variabile, di tipo stringa, valorizzata in modo qualsiasi: VAR riga:STRING; WRITELN(F, RIGA); Addirittura il nome fisico del file potrebbe essere una variabile (VAR NomeFisico:STRING) ASSIGN(F, NomeFisico)
Append Nel caso si volessero aggiungere nuove righe in coda ad un file già esistente, occorrerebbe aprirlo NON con REWRITE ma con APPEND(F) NB. Se il file non esiste, lo crea Naturalmente, sia nella scrittura che nell’aggiunta, posso inserire l’istruzione WRITELN(F, ‘stringa fissa o variabile’) all’interno di cicli di varia natura (FOR o REPEAT …)
LETTURA DEL FILE Per aprire il file in lettura si utilizza il comando: RESET(F) Poiché il contenuto del file viene letto, RIGA PER RIGA, da memoria di massa, occorre definire una variabile ‘contenitore’ per ricevere di volta in volta la riga letta es. VAR riga:STRING; L’istruzione di lettura della riga è: READLN(F, RIGA)
Lettura dell’intero file Per poter leggere l’intero file è necessario leggere tutte le righe con un ciclo. Spesso non sappiamo di quante righe si tratta (escludiamo quindi il ciclo FOR) Ma sappiamo che l’ultimo carattere è l’EOF Per cui WHILE NOT EOF(F) DO BEGIN READLN(F, RIGA); ….. <trattamento sulla riga, es. visualizzazione> END;
Esame carattere per carattere di ogni riga E’ anche possibile esaminare i caratteri di ogni riga del testo utilizzando la funzione: EOL(F) End Of Line L’istruzione però sarà READ(F, c) dove c è una variabile di tipo char (al posto di READLN(F, s) con s:STRING)
Esempio (1) program provatxt; var testo:text; c:char; i,tot,b,totb:integer; begin assign(testo,'C:\devpascal\filetext\dante.txt'); reset(testo); …..
Esempio (2) // finchè non è finito il file (per ogni riga del file) while not eof(testo) DO begin i:=0; b:=0; // finchè non è finita la riga // (per ogni carattere della riga) while not(eoln(testo)) do // leggi il carattere: ATTENZIONE: READ e non readln read(testo,c); write(c); i:=i+1; if c=' ' then b:=b+1; end;
Esempio (3) // ora ha finito la riga e deve andare a capo, // per leggere la prossima readln(testo); (attenzione: READLN e non READ) writeln(' ',i,' caratteri ',b,' spazi'); tot:=tot+i; totb:=totb+b; end; writeln('Il testo contiene in tutto ', tot,' caratteri e ',totb,' spazi o blanks'); close(testo); readln; end.