Presentazione di PowerPointbloisi/didattica/comunicazioniElettronica1011/... · sopravvivere allo...

Post on 29-Jun-2020

3 views 0 download

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

salza@dis.uniroma1.it

http://www.dis.uniroma1.it/~salza/fondamenti.htm

Parte II – ing. Domenico Daniele Bloisi

bloisi@dis.uniroma1.it

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:bloisi@dis.uniroma1.it

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