! I file di testo non sono indispensabili: sono semplicemente comodi 1. Sintassi:

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

FILE BINARI FILE BINARI

FILE BINARI FILE BINARI

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

Un file è un astrazione di memorizzazione di dimensione potenzialmente illimitata (ma non infinita), ad accesso sequenziale.

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

FILE BINARI. 8QILOHELQDULRqXQDVHTXHQ]DGLE\WH

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

I files in C. A cura del prof. Ghezzi

Struttura dati FILE. Concetto di FILE

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

file fisico file logico

La gestione dei file in C

Gestione dei File. dischi nastri cd

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

Gestione dei file. File di testo e binari

Esercizi. I File ed il C

Fondamenti di Informatica T. Linguaggio C: File

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

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

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

Esercitazioni di Fondamenti Informatica - Modulo A

File binari e file di testo

ESEMPIO COMPLETO FILE BINARIO

Struttura dati FILE. Motivazioni: memorie a confronto

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

Fondamenti di Informatica T-1 Modulo 2

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

Introduzione al C. Stream e disk file

File e puntatori a file

puntatori Lab. Calc. AA 2007/08 1

Linguaggio C: i file

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

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

Linguaggio C Gestione File

Stringhe e allocazione dinamica della memoria

Scrittura formattata - printf

int ninv; /* numero di inventario */

Gestione dei File in C

Allocazione dinamica della memoria

Esercizio 1. Esercizio 1 - Soluzione

PROVA SCRITTA 23 MARZO 2010

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

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

Fondamenti di Informatica

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

LP1 Lezione 13: i File in C. Maurizio Tucci

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

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

Esercizio 1: Puntatori impiegati che sono manager

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2013

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

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008

Il linguaggio C I file. mylib.h contribuenti.txt. #include <stdio.h> #define N 25 Paolucci,Enrico, 24000,23.0. fornitori.dat

ARCHIVI E FILE. Prof. Ciaschetti

I File. File. File di testo. Esempi di file di testo. Gestione di file in C. Gestione di file in C

GESTIONE DEI FILE IL CONCETTO DI FILE

Gestione dei File C. Generalità

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

Esercitazione 6. Array

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

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

Esercizio 1 Liste: calcolo perimetro di un poligono

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

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Il linguaggio C Puntatori

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Caratteri e stringhe

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Strutture Dati Dinamiche

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

Input/Output di numeri

Esercitazione 11. Liste semplici

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

1. Realizzare una funzione: int trovaritardatari(file *fprestiti, FILE *frate, Prestito *dest, int dim)

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

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

Gestione di files Motivazioni

5. Quinta esercitazione autoguidata: liste semplici

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

MATLAB-UD5. Array di strutture. File.

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

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

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

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

Gestione dei file in PHP

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

Esercizio 1 - Soluzione

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

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

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

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

strutture e file di testo/binari Esercizio - lettura/filtro/scrittura PEOPLE.TXT PARTNERS.DAT Due persone sono compatibili

Transcript:

Un file binario è una pura sequenza di byte, senza alcuna strutturazione particolare! È un'astrazione di memorizzazione assolu -tamente generale, usabile per memorizza -re 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! 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 ci può essere EOF, perché un file binario non è una sequenza di caratteri!!qualsiasi byte si scegliesse come marcatore, potrebbe sempre capitare nella sequenza 2 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: 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: 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) effet -tivamente 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 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 Leggere da un file binario numeri.dat una sequenza di interi, scrivendoli in un array Scrivere su un file di caratteri testo.txt una sequenza di caratteri 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 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 effettivamente letti 7 Scelta: salvare anche terminatore stringa 8

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 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 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' 00110010 00110011 che costituisce la rappresentazione esterna del numero, e la converte nella corrispondente rappresentazione interna, ottenendo i due byte: 00000000 00010111 carattere '3' che rappresentano in binario il valore ventitre 11 12

fread() invece preleverebbe i due byte carattere '2' 00110010 00110011 carattere '3' credendoli già la rappresentazione interna di un numero, senza fare alcuna conversione In questo modo sarebbe inserita 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 (che produce sempre e solo file di testo) 14 È 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; 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

; 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); 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 fclose(f); 17 18 rossi > ÿÿ @ T 8! ôü _ â3 mario 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 ; 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) 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 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