FILE BINARI FILE BINARI FILE BINARI. OUTPUT BINARIO: fwrite()

Documenti analoghi
FILE BINARI FILE BINARI

FILE BINARI FILE BINARI

FILE BINARI. I file di testo non sono indispensabili: sono semplicemente comodi 1

FILE BINARI. I file di testo non sono indispensabili: sono semplicemente comodi!

FILE BINARI. I file di testo non sono indispensabili: sono semplicemente comodi 1

snapshot della memoria rappresentazioni interne binarie di numeri immagini, audio, musica, volendo, anche caratteri

Gestione dei file. Linguaggio ANSI C Input/Output - 13

I file possono essere manipolati (aperti, letti, scritti ) all interno di programmi C. dischi nastri cd

Struttura dati FILE. Concetto di FILE

Gestione dei File. dischi nastri cd

ESEMPIO COMPLETO FILE BINARIO

Suggerimenti, note utili ed errori comuni. Fondamenti di informatica T

Gestione dei file. File di testo e binari

Esercizi. I File ed il C

GESTIONE DEI FILE persistenza archiviare file astrazione fornita dal sistema operativo dimensione potenzialmente illimitata ad accesso sequenziale

Fondamenti di Informatica T. Linguaggio C: File

GESTIONE DEI FILE IL CONCETTO DI FILE APERTURA E CHIUSURA DI UN FILE OPERARE SUI FILE

Sono file di caratteri, organizzati in linee. Ogni linea e` terminata da una marca di fine linea (newline, cara ttere '\n').

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. I file in Matlab

Una testina di lettura/scrittura (ideale) indica in ogni istante il record corrente:

Stringhe e allocazione dinamica della memoria

Gestione dei File in C

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

MATLAB: FILES. Informatica B/C - A.A. 2013/2014

Scrittura formattata - printf

Linguaggio C Gestione File

Linguaggio C: i file

Introduzione al C. Stream e disk file

Fondamenti di Informatica

LP1 Lezione 13: i File in C. Maurizio Tucci

I File. Il file e` l'unita` logica di memorizzazione dei dati su memoria di massa.

puntatori Lab. Calc. AA 2007/08 1

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Fondamenti di Informatica T-1 Modulo 2

Esercizio 1: Puntatori impiegati che sono manager

Gestione dei File C. Generalità

Corso di Laurea in Ingegneria Meccanica A-K. Fondamenti di Informatica A. A Gestione dei File. A.Pinto

GESTIONE DEI FILE. I file possono essere manipolati (aperti, letti, scritti ) all interno di programmi C. dischi nastri cd

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

ARCHIVI E FILE. Prof. Ciaschetti

FILE: tipo operazione Istruì. prototipo esempi lettura di un carattere fgetc Int fgetc(file *flusso) Vedi sotto

GESTIONE DEI FILE IL CONCETTO DI FILE

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Esercizio 1 Liste: calcolo perimetro di un poligono

Esercitazione 6. Array

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Caratteri e stringhe

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Input/Output di numeri

Il linguaggio C. Notate che...

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori

Esercizi per il recupero del debito formativo:

Capitolo 11 Elaborazione di file

Laboratorio di Algoritmi e Strutture Dati

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

Gestione di files Motivazioni

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

MATLAB-UD5. Array di strutture. File.

Introduzione al C. Esercitazione 6. Raffaele Nicolussi. Corso di Fondamenti di Informatica Ingegneria Clinica

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

IL PRIMO PROGRAMMA IN C

Introduzione al C. Unità 9 File. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

È possibile definire vettori di qualunque tipo Possiamo, quindi, anche avere vettori di stringhe Ad esempio:

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

SOMMARIO SU LETTURA E SCRITTURA (I/O) DEGLI STANDARD FILES

Fondamenti di Informatica

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Corso sul linguaggio Java

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 21 Gennaio 1998

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Lezione 6 Selection/Insertion Sort su interi e stringhe

Mini-dispensa sui puntatori in C

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

I File. I file vengono distinti in due categorie: ILOHGLWHVWR costituiti da caratteri ed organizzati in linee (ciascuna terminata da \n ) )LOHGLWHVWR

I file. un file è una sorgente/destinazione di dati per diversi attori

Input/output in C e in C++

Puntatori a Funzioni e Callback. Massimo Benerecetti

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Lab 11 Gestione file di testo"

Primi passi col linguaggio C

Corso di Informatica 1 Esercitazione n. 4

Guida allo sviluppo di applicazioni in linguaggio C# 1. ELABORAZIONE FILE DI TESTO : RIPRENDIAMO ALCUNE IDEE... 2

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Linguaggio C: Stringhe di caratteri e File

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Transcript:

FILE BINARI Un file binario è una pura sequenza di byte, senza alcuna strutturazione particolare È un'astrazione di memorizzazione assolutamente generale, usabile per memorizzare su file informazioni di qualsiasi natura snapshot della memoria rappresentazioni interne binarie di numeri immagini, audio, musica, volendo, anche caratteri I file di testo non sono indispensabili: sono semplicemente comodi 1 FILE BINARI Un file binario è una sequenza di byte Può essere usato per archiviare su memoria di massa qualunque tipo di informazione Input e output avvengono sotto forma di una sequenza di byte La fine del file è SEMPRE rilevata in base all esito delle operazioni di lettura non c'è EOF, perché un file binario non è una sequenza di caratteri qualsiasi byte si scegliesse come marcatore, potrebbe sempre capitare nella sequenza 2 FILE BINARI Poiché un file binario è una sequenza di byte, sono fornite due funzioni per leggere e scrivere sequenze di byte fread() legge una sequenza di byte fwrite() scrive una sequenza di byte Sintassi: OUTPUT BINARIO: fwrite() int fwrite(addr, int dim, int n, FILE *f); scrive sul file n elementi, ognuno grande dim byte (complessivamente, scrive quindi n*dim byte) gli elementi da scrivere vengono prelevati dalla memoria a partire dall indirizzo addr restituisce il numero di elementi (non di byte) effettivamente scritti, che possono essere meno di n 3 4

Sintassi: INPUT BINARIO: fread() int fread(addr, int dim, int n, FILE *f); legge dal file n elementi, ognuno grande dim byte (complessivamente, tenta di leggere quindi n*dim byte) gli elementi da leggere vengono scritti in memoria a partire dall indirizzo addr restituisce il numero di elementi (non di byte) effettivamente letti, che possono essere meno di n se il file finisce prima. Controllare il valore restituito è il SOLO MODO per sapere che cosa è stato letto, e in particolare per scoprire se il file è terminato 5 ESEMPIO 1 Salvare su un file binario numeri.dat il contenuto di un array di dieci interi In alternativa: int main(void){ fwrite(vet, 10*sizeof(int), 1, fp) FILE *fp; int vet[10] = {1,2,3,4,5,6,7,8,9,10; if ((fp = fopen("numeri.dat","wb"))==null) exit(1); /* Errore di apertura */ fwrite(vet, sizeof(int), 10, fp); fclose(fp); sizeof() è essenziale per la portabilità del sorgente: la dimensione di int non è fissa 6 ESEMPIO 2 Leggere da un file binario numeri.dat una sequenza di interi, scrivendoli in un array fread tenta di leggere 40 interi, ne int main(void){ legge meno se il file finisce prima FILE *fp; int vet[40], i, n; if ((fp = fopen("numeri.dat","rb"))==null) exit(1); /* Errore di apertura */ n = fread(vet,sizeof(int),40,fp); for (i=0; i<n; i++) printf("%d ",vet[i]); fclose(fp); n contiene il numero di interi effettivamente letti 7 Scrivere su un file di caratteri testo.txt una sequenza di caratteri ESEMPIO 3 Dopo averlo creato, provare ad aprire questo file con un editor qualunque int main(void){ FILE *fp; int n; char msg[] = "Ah, l'esame\nsi avvicina!"; if ((fp = fopen("testo.txt","wb"))==null) exit(1); /* Errore di apertura */ fwrite(msg, strlen(msg)+1, 1, fp); fclose(fp); Un carattere in C ha sempre size=1 Scelta: salvare anche terminatore stringa 8

ESEMPIO 4: OUTPUT DI NUMERI L uso di file binari consente di rendere evidente la differenza fra la rappresentazione interna di un numero e la sua rappresentazione esterna come stringa di caratteri in una certa base Supponiamo che sia int x = 31466; Che differenza c è fra: fprintf(file,"%d", x); fwrite(&x, sizeof(int), 1, file); 9 ESEMPIO 4: OUTPUT DI NUMERI Se x è un intero che vale 31466, internamente la sua rappresentazione è (su 16 bit): 01111010 11101010 fwrite() emette direttamente tale sequenza, scrivendo quindi i due byte sopra indicati fprintf() invece emette la sequenza di caratteri ASCII corrispondenti alla rappresentazione esterna del numero 31466, ossia i cinque byte 00110011 00110001 00110100 00110110 00110110 Se per sbaglio si emettessero su un file di testo (o su video) direttamente i due byte: 01111010 11101010 si otterrebbero i caratteri corrispondenti al codice ASCII di quei byte: êz 10 ESEMPIO 5: INPUT DI NUMERI Analogamente, che differenza c è fra fscanf(file, "%d", &x); e fread(&x, sizeof(int), 1, file); nell ipotesi che il file (di testo) contenga la sequenza di caratteri 23? 2 3 fscanf() preleva la stringa di caratteri ASCII carattere '2' ESEMPIO 5: INPUT DI NUMERI 00110010 00110011 carattere '3' che costituisce la rappresentazione esterna del numero, e la converte nella corrispondente rappresentazione interna, ottenendo i due byte: 00000000 00010111 che rappresentano in binario il valore ventitre 11 12

fread() invece preleverebbe i due byte carattere '2' ESEMPIO 5: INPUT DI NUMERI 00110010 00110011 carattere '3' credendoli già la rappresentazione interna di un numero, senza fare alcuna conversione Tale modo di agire porterebbe a inserire nella variabile x esattamente la sequenza di byte sopra indicata, che verrebbe quindi interpretata come il numero tredicimilacentosei 13 È dato un file binario people.dat i cui record rappresentano ciascuno i dati di una persona, secondo il seguente formato: cognome (al più 30 caratteri) nome (al più 30 caratteri) sesso (un singolo carattere, 'M' o 'F') anno di nascita Si noti che la creazione del file binario deve essere sempre fatta da programma, mentre per i file di testo può essere fatta con un text editor 14 CREAZIONE FILE BINARIO È necessario scrivere un programma che lo crei strutturandolo in modo che ogni record contenga una ; I dati di ogni persona da inserire nel file vengono richiesti all utente tramite la funzione leggiel() che non ha parametri e restituisce come valore di ritorno la struct persona letta. Quindi il prototipo è: struct persona leggiel(); 15 struct persona leggiel(){ struct persona e; CREAZIONE FILE BINARIO printf( Cognome? "); scanf("%s", e.cognome); printf("\n Nome? "); scanf("%s",e.nome); printf("\nsesso? "); scanf("%s",e.sesso); printf("\nanno nascita? "); scanf("%d", &e.anno); return e; 16

CREAZIONE FILE BINARIO ; struct persona leggiel(); int main(void){ FILE *f; struct persona e; int fine=0; f=fopen( people.dat, "wb"); while (!fine) { e=leggiel(); fwrite(&e,sizeof(struct persona),1,f); printf("\nfine (SI=1, NO=0)?"); scanf("%d", &fine); fclose(f); 17 CREAZIONE FILE BINARIO L esecuzione del programma precedente crea il file binario contenente i dati immessi dall utente. Solo a questo punto il file può essere utilizzato Il file people.dat non è visualizzabile tramite un text editor: questo sarebbe il risultato rossi > ÿÿ @ T 8 â3 mario ôü _ ôü Aw O F _ DÝ M nuinh2ô1 ô1 ô1 18 Ora si vuole scrivere un programma che legga record per record i dati dal file ponga i dati in un array di persone (poi svolgeremo elaborazioni su essi) 1) Definire una struttura di tipo persona Occorre definire una struct adatta a ospitare i dati elencati: cognome array di 30+1 caratteri nome array di 30+1 caratteri sesso array di 1+1 caratteri anno di nascita un intero ; 19 20

2) definire un array di struct persona 3) aprire il file in lettura int main(void) { struct persona v[dim]; FILE* f = fopen("people.dat", "rb"); if (f==null) { printf( Il file non esiste ); exit(1); /* terminazione del programma */... 21 4) leggere i record dal file, e porre i dati di ogni persona in una cella dell'array Come organizzare la lettura? int fread(addr, int dim, int n, FILE *f); legge dal file n elementi, ognuno grande dim byte (complessivamente, legge quindi n*dim byte) gli elementi da leggere vengono scritti in memoria a partire dall indirizzo addr Uso fread() 22 #define DIM 30 ; int main(void) { struct persona v[dim]; int i=0; FILE* f; if ((f=fopen("people.dat", "rb"))==null) { printf("il file non esiste!"); exit(1); while(fread(&v[i],sizeof(struct persona),1,f)>0) i++; 23 Che cosa far leggere a fread()? Se vogliamo, anche l intero vettore di strutture: unica lettura per DIM record (solo se sappiamo a priori che i record da leggere sono esattamente DIM) fread(v,sizeof(struct persona),dim,f) 24

#define DIM 30 ; int main(void) { struct persona v[dim]; int i=0; FILE* f; if ((f=fopen("people.dat", "rb"))==null) { printf("il file non esiste!"); exit(1); fread(v,sizeof(struct persona),dim,f); 25