Esercizi File - Dipartimento di Ingegneria informatica ... · Esercizi File Corso di Fondamenti di...

Preview:

Citation preview

Esercizi FileCorso di Fondamenti di InformaticaIngegneria delle Comunicazioni – BCORIngegneria Elettronica – BELR

Unità 8

Domenico Daniele Bloisi

Si ringrazia Raffaele Nicolussi

Docenti

Parte I – prof. Silvio Salzasalza@dis.uniroma1.itsalza@dis.uniroma1.it

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

Parte II – ing . Domenico Daniele Bloisi, PhDbloisi@dis.uniroma1.it

http://www.dis.uniroma1.it/ ~bloisi /didattica /fondinf1112.htmlhttp://www.dis.uniroma1.it/ ~bloisi /didattica /fondinf1112.html

Nota: %7E corrisponde alla tilde ~

2011/2012Esercizi FileUnità 8

Pagina 2

Informazioni Generali

ing. Domenico Daniele Bloisi, PhD

Dipartimento di Informatica e SistemisticaVia Ariosto 25Via 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

2011/2012Esercizi FileUnità 8

Pagina 3

Ricevimento

Su appuntamento. Inviare una email per conferma.

DIS, via Ariosto 25DIS, via Ariosto 25II piano, stanza B211

Si consiglia di controllare la bacheca degli avvisihttp://www.dis.uniroma1.it/~bloisi/didattica/fondin f1112.html#Avvisi

2011/2012Esercizi FileUnità 8

Pagina 4

Uso dei File in C

1. Dichiarare il descrittore del fileFILE *<descrittore>;

Esempio:FILE* fd;

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 >:

Pagina 52011/2012

• <modo_apertura >:es. "w" se il file è aperto in scritturaes. "r" se il file è aperto in lettura

Esercizi FileUnità 8

fd = fopen("C:/code/dati.txt", "w");

Uso dei File in C

3. Controllo della corretta aperturaif(fd != NULL) {

4. Esecuzione delle operazioni di lettura o scrittura utilizzando il descrittore del file

5. Il file viene chiusofclose (<descrittore>);

fprintf(fd, "dato");

Pagina 62011/2012

fclose (<descrittore>);

Esercizi FileUnità 8

}fclose(fd);

Esempio#include <stdio.h>#include <stdlib.h>

modalitàscritturaint main()

{FILE *fp;int x = 1;if ((fp = fopen("file.txt","w")) != NULL){

fprintf(fp, "stampa n. %d su file \ n", x);

scrittura

Pagina 72011/2012Esercizi FileUnità 8

fprintf(fp, "stampa n. %d su file \ n", x);}fclose(fp);

}

Esecuzione

Se il file denominato “file.txt” non esiste nella directory contenente l’eseguibile che traduce il codice, “file.txt” viene creato.codice, “file.txt” viene creato.

Se “file.txt” esiste già, il suo contenuto viene cancellato.

Successivamente, il file “file.txt” viene riempito

Pagina 82011/2012Esercizi FileUnità 8

Successivamente, il file “file.txt” viene riempito con la stringa argomento della fprintf .

Esecuzione

Pagina 92011/2012Esercizi FileUnità 8

Attenzione

Mai dimenticare di richiudere uno stream (dopo averlo aperto) al termine del suo (dopo averlo aperto) al termine del suo utilizzo.

L’istruzione da utilizzare è laint fclose(FILE *file_pointer)che chiude un FILE* passato come argomento

Pagina 102011/2012Esercizi FileUnità 8

argomento

Valore di ritorno per fclose

fclose returns '0' if successful(including when file_pointer is 'NULL' or (including when file_pointer is 'NULL' or not an open file);otherwise, it returns 'EOF'.

http://www.cplusplus.com/reference/clibrary/cstdio/ fclose/

Pagina 112011/2012Esercizi FileUnità 8

Esercizio

Scrivere un programma che chieda all’utente di inserire da tastiera il nome per un file ed di inserire da tastiera il nome per un file ed una stringa che sarà scritta in esso.

Il programma deve creare il file e scrivere in esso la stringa digitata dall’utente.Un messaggio di errore deve essere stampato

Pagina 122011/2012Esercizi FileUnità 8

Un messaggio di errore deve essere stampato a video in caso di insuccesso.

Soluzione#include <stdlib.h>#include <stdio.h>

int main () {int main () {char nomefile[80], parola[80];printf("digita il nome del file da creare:\n");scanf("%s", nomefile);printf("digita una parola da scrivere sul file:\n") ;scanf("%s", parola);FILE *fp;if ((fp = fopen(nomefile,"w")) != NULL) {

fprintf ( fp , " %s", parola);

Pagina 132011/2012Esercizi FileUnità 8

fprintf ( fp , " %s", parola);}else

fprintf(stderr, "ERRORE\n");fclose(fp);

}

Esempio di esecuzione

digita il nome del file da creare:prova.txtdigita una parola da scrivere sul file:digita una parola da scrivere sul file:parole parole parole

Che cosa provoca l’esecuzione del programma con questi input?

Pagina 142011/2012Esercizi FileUnità 8

con questi input?

Modalità di accesso ai file

rApre un file esistente inmodalità lettura (read)posizionandosi all’iniziodel file.del file.

w

Crea un nuovo file e loapre in modalità scrittura(write) posizionandosiall’inizio del file. Se il fileesiste i dati precedentivengono eliminati.

Apre un file esistente in

Pagina 152011/2012Esercizi FileUnità 8

aApre un file esistente inmodalità append; lascrittura avviene a partiredalla fine del file.

Modalità di accesso ai file

r+Apre un file esistente inmodalità lettura e scritturaposizionandosi all’iniziodel file.del file.

w+Crea un nuovo file e lo apre in modalità scrittura e lettura.Se il file esiste i dati precedenti vengono eliminati.

a+

Apre un file esistente o necrea uno nuovo in modalitàappend ; la scrittura avviene a

Pagina 162011/2012Esercizi FileUnità 8

a+ append ; la scrittura avviene a partire dalla fine del file mentre la posizione di lettura può essere scelta.

I/O su stdin e stdout

getchar(void)Legge il prossimo carattere dal flusso di input standard;equivalente a getc ( stdin ) .equivalente a getc ( stdin ) .

gets(char *str) Legge i caratteri da stdin fino a newline o fino alla fine del file.

printf(…)

Scrive uno o più valori sul flusso di output standard in accordo con le regole di formazione definite dall’utente.

Pagina 172011/2012Esercizi FileUnità 8

definite dall’utente.

putchar(int ch)Scrive un carattere sul flusso di output standard; equivalente aputc(stdout) .

I/O su stdin e stdout

puts(const char *str)Scrive una stringa di caratteri sustdout , inserendo un carattere dinewline al termine della stringa.

scanf(…)

Legge uno o più valori da stdin ,interpretandoli in accordo con leregole di formattazione definitedall’utente.

Pagina 182011/2012Esercizi FileUnità 8

I/O su FILE

fgetc(FILE *stream)Legge un carattere da un flusso e fa puntare l’indicatore del file al carattere successivo.

fgets( char *str,int num,FILE *stream )

Legge una stringa da un flusso di input specificato. Consente di specificare il numero massimo dicaratteri da leggere.

Pagina 192011/2012Esercizi FileUnità 8

Fine di un File

feof (FILE *stream)

Controlla se è stata raggiunta lafine del file, associato allostream , durante la precedenteoperazione di lettura

Pagina 202011/2012Esercizi FileUnità 8

Esempio feof

#include <stdio.h>#include <stdlib.h>

int main() {int main() {long n = 0;FILE* fd;fd = fopen("lettera.txt", "r+");if(fd == NULL) {

exit(EXIT_FAILURE);}while(!feof(fd)) {

fgetc(fd);n++;

Pagina 212011/2012Esercizi FileUnità 8

n++;}printf("Letti %ld bytes\n", n);fprintf(fd, "<aggiunta>");fclose(fd);

}

Input

Pagina 222011/2012Esercizi FileUnità 8

Esecuzione

Letti 40 bytes

Pagina 232011/2012Esercizi FileUnità 8

Esempio feof modificatoint main() {

long n = 0;FILE* fd;fd = fopen("lettera.txt", "r+");fd = fopen("lettera.txt", "r+");if(fd == NULL) {

exit(EXIT_FAILURE);}fprintf(fd, "<aggiunta>");while(!feof(fd)) {

printf("prima di fgetc\n");fgetc(fd);printf("dopo di fgetc\n");n++;

Pagina 242011/2012Esercizi FileUnità 8

n++;}printf("Letti %ld bytes\n", n);fclose(fd);

}

Esecuzione…prima di fgetcdopo di fgetcprima di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetc

Si entra in un loop infinito

Pagina 252011/2012Esercizi FileUnità 8

dopo di fgetcprima di fgetcdopo di fgetcprima di fgetc…

Esempio feof correttamente modificato

int main() {long n = 0;FILE* fd;fd = fopen("lettera.txt", "r+");if(fd == NULL) {if(fd == NULL) {

exit(EXIT_FAILURE);}fprintf(fd, "<aggiunta>");fclose(fd);fd = fopen("lettera.txt", "r+");if(fd == NULL) {

exit(EXIT_FAILURE);}while(!feof(fd)) {

printf("prima di fgetc\n");fgetc(fd);

Pagina 262011/2012Esercizi FileUnità 8

fgetc(fd);printf("dopo di fgetc\n");n++;

}printf("Letti %ld bytes\n", n);fclose(fd);

}

Esecuzione…prima di fgetcdopo di fgetcprima di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetcprima di fgetcdopo di fgetc

Pagina 272011/2012Esercizi FileUnità 8

dopo di fgetcprima di fgetcdopo di fgetcLetti 40 bytes

Esempio: conteggio caratteri in un file

int main( ) {FILE *fPtr ;char ch ;long int cont = 0 ;long int cont = 0 ;if((fPtr = fopen("lettera.txt", "r")) != NULL){

while( fscanf(fPtr, "%c", &ch ) != EOF ) {cont++ ;

}printf( "cont = %ld\n" , cont ) ;// cont = numero caratteri in "lettera.txt"fclose ( fPtr ) ;

Pagina 282011/2012Esercizi FileUnità 8

fclose ( fPtr ) ;}else

printf( "errore apertura file" ) ;return EXIT_SUCCESS;

}

Esecuzione

cont = 39

Perché otteniamo un valore diverso rispetto a “Esempio feof “ ?

Pagina 292011/2012Esercizi FileUnità 8

Esempio: acquisizione array da file

Si assuma di avere un file denominato “comp.dat”di 10 righe che rappresenti un array di dieci eleme ntiinteri, con ogni elemento memorizzato in una riga.interi, con ogni elemento memorizzato in una riga.

Pagina 302011/2012Esercizi FileUnità 8

Esempio: acquisizione array da filescheletro del programma…FILE *frPtr ;int v[ max_d ] , pos ;……/* Formato "comp.dat": 1 int per linea; numerolinee = max_d */if ((( frPtr = fopen( "comp.dat" , "r" )) != NULL ) ){

for( pos = 0 ; pos < max_d ; pos++ )fscanf( frPtr , "%d" , &v[ pos ] ) ;

Pagina 312011/2012Esercizi FileUnità 8

…fclose( frPtr ) ;

}else printf( "errore apertura file\n" ) ;…

Esempio: acquisizione array da filecodice completo#include <stdio.h>#include <stdlib.h>

int main( ) {int max_d = 10;int max_d = 10;FILE *frPtr;int v[max_d], pos;if ((( frPtr = fopen( "comp.dat" , "r" )) != NULL )){

for( pos = 0 ; pos < max_d ; pos++ )fscanf( frPtr , "%d" , &v[pos] ) ;

fclose( frPtr ) ;}

Pagina 322011/2012Esercizi FileUnità 8

}else printf( "errore apertura file\n" ) ;for( pos = 0 ; pos < max_d ; pos++ )

printf("%d ", v[ pos ] ) ;printf("\n");return EXIT_SUCCESS;

}

Esecuzione

12 34 56 78 99 13 14 56 654 -12

Pagina 332011/2012Esercizi FileUnità 8

Trasformare caratteri in interi

La funzione atoi converte una stringa in un intero.

Ad esempio, è utile quando si debba fare dei calcoli numerici con parametri passati da riga di comando. Infatti, i calcoli richiederanno dei tipi numerici (e.g., int ) e non delle stringhe (tipo char * ).

Pagina 342011/2012Esercizi FileUnità 8

(tipo char * ).

La funzione atoi

NAME:atoi - convert a string to an integer.

SYNOPSIS:SYNOPSIS:#include <stdlib.h>

int atoi(const char *nptr);DESCRIPTION:

The atoi() function converts the initial portion of the string pointed to by nptr to int.

Pagina 352011/2012Esercizi FileUnità 8

portion of the string pointed to by nptr to int.RETURN VALUE:

The converted value.

Esercizio

Realizzare un programma sommafile che prenda tre parametri in ingresso:<A> primo addendo;<A> primo addendo;<B> secondo addendo;<C> nome di un file.Il programma deve sommare A e B, creare un file denominato con il nome C e stampare il risultato nel file.

Pagina 362011/2012Esercizi FileUnità 8

risultato nel file.

Esempio

>sommafile -1 15 result.txt

Pagina 372011/2012Esercizi FileUnità 8

Esecuzione

Pagina 382011/2012Esercizi FileUnità 8

Funzioni di conversione

Convertono stringhe che contengono interi oreali in numeri interi o realireali in numeri interi o reali

Permettono di trattare stringhe (testi) composte da caratteri qualsiasi e di estrarre da essi le parti numeriche

libreria <stdlib.h >

Pagina 392011/2012Esercizi FileUnità 8

libreria <stdlib.h >

Funzioni di conversione

Pagina 402011/2012Esercizi FileUnità 8

Funzioni di conversione

Pagina 412011/2012Esercizi FileUnità 8

Funzioni di conversione

Pagina 422011/2012Esercizi FileUnità 8

Funzioni di conversione

Pagina 432011/2012Esercizi FileUnità 8

Funzioni di conversione

Pagina 442011/2012Esercizi FileUnità 8

Esercizi

Esercizio 8.5

Scrivere una funzione che preso in ingresso il Scrivere una funzione che preso in ingresso il nome di un file contenente interi, lo modifichi in modo da contenere gli stessi interi, ma in ordine decrescente.

Pagina 452011/2012Esercizi FileUnità 8

Esercizi

Esercizio 8.6

Scrivere un programma che legga caratteri dalla Scrivere un programma che legga caratteri dalla tastiera e li scriva su un file “copia.txt” fino a che l'utente non immetta il carattere '$', nel qual caso il programma deve terminare verificando la corretta chiusura del file.

Pagina 462011/2012Esercizi FileUnità 8

Esercizi

Esercizio 8.7

Scrivere un programma che legga un file di testo Scrivere un programma che legga un file di testo “m.txt” contenente 5 righe, con 5 interi separati da uno spazio per ogni riga. Il programma deve leggere il file, creare una matrice 5x5 contenente i dati presenti in “m.txt” e stamparne la trasposta.

Pagina 472011/2012Esercizi FileUnità 8

trasposta.

Recommended