Presentazione di PowerPointbloisi/didattica/comunicazioniElettronica1011/... · sopravvivere allo...
Transcript of Presentazione di PowerPointbloisi/didattica/comunicazioniElettronica1011/... · sopravvivere allo...
Corso di Fondamenti di Informatica
Ingegneria delle Comunicazioni BCOR
Ingegneria Elettronica BELR
Parte 8
File
Domenico Daniele Bloisi
Si ringrazia Raffaele Nicolussi
2010/2011File
Parte 8
Pagina 2
Docenti
Parte I – prof. Silvio Salza
http://www.dis.uniroma1.it/~salza/fondamenti.htm
Parte II – ing. Domenico Daniele Bloisi
http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html
Nota: %7E corrisponde alla tilde ~
Pagina 3
Informazioni Generali
ing. Domenico Daniele Bloisi, PhD
Dipartimento di Informatica e Sistemistica
Via Ariosto 25
(adiacente Piazza Dante,
A fermate Manzoni, Vittorio Emanuele,
Tram 3 fermata via Labicana)
mailto:[email protected]
http://www.dis.uniroma1.it/~bloisi
2010/2011File
Parte 8
Ricevimento
Pagina 4
Martedì 15.00 – 17.00
DIS, via Ariosto 25
Aula docenti adiacente aula A4
Si consiglia di inviare una email per conferma e
di controllare la bacheca degli avvisi
http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html#Avvisi
2010/2011File
Parte 8
Pagina 52010/2011
Sommario – Parte 8
• Array di caratteri: stringhe
• Inizializzazione di stringhe
• Lettura e scrittura di stringhe
• Operazioni sulle stringhe
• Funzioni per la manipolazione delle
stringhe: strcpy, strncpy, strcat, strncat,
strcmp, strstr
• Input/Output in C
• Stream
• File
Operazioni sulle stringhe
Parte 8
Pagina 62010/2011
I/O in C
File
Parte 8
Il sistema di I/O del C è una interfaccia uniforme
per il programmatore indipendentemente dal
dispositivo di lettura e scrittura utilizzato.
Scrivere o leggere da file o da video/tastiera
non comporta differenze.
Schema di un calcolatore
Tastiera
Mouse
Stampante
Modem
bus
Porte I/O
CPU
Controller
dischi
Memoria
Scheda
video
Scheda
audio
Scheda
rete
Hard disk
CD/ROM
DVD
Monitor
Casse
Microfono
Altro PC
Internet
Pagina 72010/2011File
Parte 8
Pagina 82010/2011
Sistema di I/O
File
Parte 8
Il sistema di I/O del C crea un livello di
astrazione tra il programmatore e
l’oggetto (sia esso un file o dispositivo)
Viene creato un meccanismo di astrazione
tramite un flusso di dati o stream
Pagina 92010/2011
Stream
File
Parte 8
Uno stream (flusso di dati) fornisce un
canale di comunicazione tra il programma
e l’esterno (file o device)
Uno stream è una struttura costituita da
una sequenza di byte terminante con un
apposito carattere che ne identifica la fine.
Pagina 102010/2011
Stream
File
Parte 8
Gli stream vengono associati (con opportuni
comandi)
ai dispositivi fisici collegati al computer
(tastiera, video, stampante, etc…)
a file residenti sulla memoria di massa
Bufferizzazione
Gli streams di I/O sono bufferizzati: questo
significa che ogni volta viene letto da un file o
scritto su di esso un "pezzo" di dimensioni
stabilite attraverso alcune aree temporanee di
immagazzinamento (è importante notare che il
file puntatore punta effettivamente a questo
buffer).
Pagina 112010/2011File
Parte 8
Bufferizzazione
Pagina 122010/2011File
Parte 8
Questo metodo rende efficiente l'I/O, ma è
necessario fare attenzione:
i dati scritti in un buffer non compaiono nel
file (o nel device) finché il buffer non è
riempito o scaricato ("\n" serve a questo).
Qualsiasi uscita anormale del programma
può causare problemi.
Pagina 132010/2011
FILE
File
Parte 8
Esiste una struttura di dati interna al C, FILE, che rappresenta uno stream ed è definita nel file stdio.h.
Viene usato il nome FILE per motivi storici, anche se la
struttura FILE può essere usata per rappresentare un
oggetto diverso da un file in “senso tecnico”.
E' sufficiente fare riferimento alla struttura FILE nei
programmi C quando si realizza l'I/O utilizzando uno
stream.
Pagina 142010/2011
Esempio printf
File
Parte 8
Produce una sequenza di caratteri che viene
inviata allo stream stdout (video)
Pagina 152010/2011
Esempio scanf
File
Parte 8
Legge i caratteri dallo stream stdin (tastiera),
ossia lo stream di input e li deposita
convertendoli nello specifico formato nelle
variabili il cui indirizzo è specificato
Pagina 162010/2011
File
File
Parte 8
I file rappresentano la principale struttura per la
memorizzazione di dati in maniera permanente
su memoria di massa (hanno la caratteristica di
sopravvivere allo spegnimento della macchina).
Essi possono contenere caratteri alfanumerici
codificati in formato standard (es. ASCII)
direttamente leggibili dall’utente (file di testo),
oppure dati in un formato interpretabile dai
programmi (file binari ).
Pagina 172010/2011
File
File
Parte 8
Flusso sequenziale di byte terminato
dal carattere di terminazione chiamato
End-Of-File (EOF).
Pagina 182010/2011
File di testo
File
Parte 8
I file di testo sono normalmente organizzati in
sequenze di linee ciascuna delle quali contiene
una sequenza di caratteri.
In questo corso tratteremo solamente file di
testo.
Pagina 192010/2011
File e directory
File
Parte 8
Ogni file è caratterizzato da un nome e una
directory (o cartella) in cui risiede.
Le operazioni fondamentali sui file sono:
creazione, lettura, scrittura, rinominazione ed
eliminazione.
Queste operazioni possono essere effettuate
tramite il sistema operativo (o altri programmi
applicativi) oppure mediante apposite istruzioni
del linguaggio C.
Pagina 202010/2011
Operazioni sui file
File
Parte 8
Per eseguire operazioni di lettura e scrittura sui
file è necessario
“aprire” il file prima di eseguire le operazioni
“chiudere” il file al termine dell’esecuzione
delle operazioni.
Pagina 212010/2011
File e stream
File
Parte 8
Il file deve essere connesso al programma
tramite l’astrazione dello stream.
L’apertura e la chiusura dello stream
associato al file non sono automaticicome invece nel caso di stdin, stdout,
stderr
Pagina 222010/2011
Aprire un File
File
Parte 8
Aprire un file significa indicare al sistema
operativo la volontà di eseguire operazioni sui
file.
Il sistema operativo verificherà all’atto
dell’apertura del file se tale operazione è
possibile.
Pagina 232010/2011
Scrittura e lettura
File
Parte 8
L’apertura del file si distingue in due casi:
1. apertura in lettura
2. apertura in scrittura
che definiscono un comportamento differente nel
sistema operativo (ad esempio, è possibile che due
applicazioni aprano lo stesso file contemporaneamente
in lettura, ma non in scrittura).
In molti linguaggi di programmazione l’apertura in
scrittura di un file coincide con la sua creazione.
Pagina 242010/2011
Le funzioni fprintf e fscanf
File
Parte 8
fprintf ( <descrittoreFile>,
<stringa di controllo>,
<altri-argomenti> )
fscanf ( <descrittoreFile>,
<stringa di controllo>,
<altri-argomenti> )
Sono le versioni di printf e scanf relative ad un
generico file esterno.
Pagina 252010/2011
Descrittore di File
File
Parte 8
Cosa è <descrittoreFile>:
È una connessione tra:
il mondo interno al programma (tutto in memoria
centrale)
e
il mondo esterno (rappresentato dai file residenti
nelle memoria di massa)
È legato al nome fisico del file e ad altre
caratteristiche strutturali
Pagina 262010/2011
Descrittore di File
File
Parte 8
Per usare file esterni
Si deve introdurre questo “rappresentante
interno” del mondo esterno
Si deve creare una associazione
temporanea tra mondo esterno e
“rappresentante interno”
Pagina 272010/2011
Sintassi - Descrittore di File
File
Parte 8
Il descrittore di file è una variabile
Bisogna specificare un nome e un tipo per
poterlo dichiarare
FILE *<identificatore>;
Esempio
FILE *ingressoDsc;
Pagina 282010/2011
Puntatore a File
File
Parte 8
FILE *ingressoDsc;
FILE * si riferisce ad uno specifico tipo
puntatore a file esterno
ingressoDsc è una variabile di tipo puntatore a
file
Attenzione: manca ancora il legame con
l’esterno
Pagina 292010/2011
Le funzioni fprintf e fscanf
File
Parte 8
int fprintf ( FILE * stream, const char * format, ... );
int fscanf ( FILE * stream, const char * format, ... );
Sono definite in stdio.h
Pagina 302010/2011
Connessione
File
Parte 8
La funzione fopen crea la connessione tra il
descrittore ed il file vero e proprio (esterno)
<descrittoreFile> =
fopen( <nomefileesterno>,
<modalità di uso> );
Esempio
ingressoDsc =
fopen("filedaleggere.txt", "r");
Pagina 312010/2011
Modalità di uso
File
Parte 8
Si deve specificare se il file va usato in letturao scrittura (si ricordi la distinzione tra stdin e
stdout )
File in lettura "r" (read)
File in scrittura "w" (write)
Scrittura alla fine del file "a" (append)
Pagina 322010/2011
Esempio
File
Parte 8
FILE *uscitaDsc;
uscitaDsc =
fopen("filedascrivere.txt", "w");
Pagina 332010/2011
Chiusura della connessione
File
Parte 8
Quando il file esterno non serve più, deve essere
chiuso
Questo si ottiene cancellando esplicitamente la
connessione con l’esterno
fclose(<descrittoreFile>);
Pagina 342010/2011
Esempio
File
Parte 8
int main (void) {
//altre dichiarazioni di variabili
FILE *inputDsc;
FILE *outputDsc;
…………………………
inputDsc =
fopen("filedatiingresso", "r")
outputDsc =
fopen("filedatiuscita.txt", "w")
…………………………
fclose(inputDsc);
fclose(outputDsc);
}
Pagina 352010/2011
Eccezioni
File
Parte 8
Nella comunicazione con il mondo esterno può
accadere che il file non si apra correttamente.
Questo viene segnalato da un valore particolare
del descrittore di file, indicato con NULL.
Dopo fopen( ) inserire sempre un controllo
if (inputDsc == NULL) {
…
}
Pagina 362010/2011
Esempi
File
Parte 8
if (inputDsc == NULL)
printf ("errore nella apertura del "
"file di ingresso");
if (outputDsc == NULL)
printf ("errore nella apertura del "
"file di uscita");
Pagina 372010/2011
Modello ideale per il File
File
Parte 8
Un file può essere immaginato come un nastro con
delle informazioni ed una testina di lettura che è il
descrittore.
La testina viene spostata da istruzioni come fscanf
e fprintf
Pagina 382010/2011
La fine del file (EOF)
File
Parte 8
La fine del file viene segnalata da un carattere
particolare, il simbolo di End-of-File (EOF)
La codifica del carattere EOF dipende dalla
macchina
• Ctrl-z per Windows
• Ctrl-d per Mac
• Ctrl-x per Unix e Linux
Pagina 392010/2011
Riassumendo
File
Parte 8
1. Viene dichiarato il descrittore del fileFILE *<descrittore>;
2. Il file si apre con la funzione fopen
<descrittore> = fopen( <nome_file>,
<modo_apertura );
• <nome_file> è il nome fisico del file, come è
chiamato sul disco, es. ingresso.dat• <modo_apertura>:
"w" se il file è aperto in scrittura
"r" se il file è aperto in lettura
Pagina 402010/2011
Riassumendo
File
Parte 8
3. Possono essere eseguite operazioni di lettura e
scrittura utilizzando il descrittore del file
4. Il file viene chiusofclose(<descrittore>);
Pagina 412010/2011
Esempio
File
Parte 8
FILE *fp;
fp = fopen("test.dat", "r");
FILE *fptr;
fptr = fopen("prova.dat", "w");
//lettura utilizzando fp e
//scrittura utilizzando fptr
fclose(fp);
fclose(fptr);
Pagina 422010/2011
Esercizio
File
Parte 8
Leggere un file di testo esempio.txt e stampare ogni
parola in una singola riga
Contenuto del
file di testo.
esempio.txt
Output
Contenuto
del
file
di
testo.
Pagina 432010/2011
Condizioni sull’input
File
Parte 8
Esiste già un file che deve essere aperto
in lettura e analizzato per produrre il
risultato desiderato.
Pagina 442010/2011
Soluzione
File
Parte 8
#include <stdio.h>
int main (){
char ch;
FILE *fd; //descrittore del file
fd = fopen("esempio.txt", "r");
if(fd != NULL){
while (fscanf(fd, "%c", &ch) != EOF) {
if(ch == ' ')
printf("\n");
else
printf("%c", ch);
}
}
else
printf ("\nErrore di apertura!");
fclose(fd);
return 0;
}
Pagina 452010/2011
Valore di ritorno per scanf
File
Parte 8
int fscanf ( FILE * stream, const char * format, ... );
fscanf restituisce un valore che è pari ad EOF
quando viene raggiunta la fine del file
Pagina 462010/2011
Operatori per leggere e scriverecaratteri
File
Parte 8
Da tastiera e video
• getchar (lettura)
• putchar (scrittura)
Da file
• fgetc(<filedescrittore>);
• fputc (<intero>, <filedescrittore>);
Pagina 472010/2011
Esempio
File
Parte 8
while((ch = fgetc(fd)) != EOF)
{
if(ch == ' ')
putchar('\n');
else
putchar(ch);
}
Pagina 482010/2011
Esercizio scrittura su file
File
Parte 8
Memorizzare su un file clienti.txt i seguenti
dati:
• Numero conto
• Bilancio
per un massimo di 10 clienti inseriti da tastiera.
Digitare EOF per terminare prima l’inserimento.
Pagina 492010/2011File
Parte 8
int main () {
int conto, i; float bilancio;
FILE *cfPtr; /* descrittore file */
if ((cfPtr = fopen("clienti.txt", "w")) == NULL)
printf("Il file non puo' essere aperto");
else {
for (i=1; i<=10; i++) {
printf("Immetti il conto e il bilancio\n");
if(scanf("%d%f", &conto, &bilancio) == EOF)
break;
fprintf(cfPtr, "%d %f\n", conto, bilancio);
}
fclose(cfPtr);
}
return 0;
}
Soluzione scrittura su file
Pagina 502010/2011
Esecuzione
File
Parte 8
Immetti il conto e il
bilancio
23 456
Immetti il conto e il
bilancio
12 8764
Immetti il conto e il
bilancio
90 -78
Immetti il conto e il
bilancio
^Z
23 456.000000
12 8764.000000
90 -78.000000
clienti.txt
Pagina 512010/2011
Esercizio lettura da file
File
Parte 8
Leggere dal file clienti.txt i seguenti
dati:
• Numero conto
• Bilancio
Pagina 522010/2011
Soluzione lettura da File
File
Parte 8
int main () {
int conto, i; float bilancio;
FILE *cfPtr; /* descrittore file */
if ((cfPtr = fopen("clienti.txt", "r")) == NULL)
printf("Il file non puo\' essere aperto\n");
else {
printf("Conto \t\t Bilancio\n");
for (i=1; i<=10; i++) {
if(fscanf(cfPtr,"%d%f",&conto,&bilancio) == EOF)
break;
printf("%d \t\t %f\n", conto, bilancio);
}
fclose(cfPtr);
}
return 0;
}
Pagina 532010/2011
Esecuzione
File
Parte 8
Conto Bilancio
23 456.000000
12 8764.000000
90 -78.000000