I file di dati. Unità didattica D1 1

Documenti analoghi
Gestione dei files. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132

Linguaggio C: i file

Laboratorio di Programmazione

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 6 Marzo 2016

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 21 Maggio 2014

I files (archivi) Il C definisce in stdio.h tre file aperti automaticamente: stdin, stdout e stderr.! Sono ad accesso sequenziale diretto

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

Operazioni su file di caratteri

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

Gestione dei File. Credits Prof. Campi

PROVA SCRITTA 23 MARZO 2010

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

Fondamenti di Informatica

Trasformare array paralleli in array di record

FILE BINARI FILE BINARI

Files in C endofile

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

Trasformare array paralleli in array di record

Gestione dei file in C

Trasformare array paralleli in array di record

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

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

A. Veneziani Files di record

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

Esercizi. I File ed il C

L AMBIENTE CODE BLOCKS E L IO

4. Accesso diretto per gli archivi con record a lunghezza costante

Gestione dei file. File di testo e binari

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

puntatori Lab. Calc. AA 2006/07 1

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Corso di Fondamenti di Programmazione canale E-O. Strutture. Strutture. Definizione di strutture (2) Definizione di strutture (1)

File binari e file di testo

L AMBIENTE CODE BLOCKS E L IO

I FILE. Un FILE è una sequenza di elementi il cui numero può crescere indefinitamente in base alle esigenze (un file è perciò una struttura dinamica).

Fondamenti di Informatica L-A

Gestione dei file in C

I files in C. A cura del prof. Ghezzi

GESTIONE DEI FILE. File come tipo di dati

Esercitazioni di Fondamenti di Informatica - Lez. 9 4/12/2018

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

Il linguaggio C I file

Gestione dei File C. Generalità

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

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

Gestione dei File in C

Tipi strutturati - struct

Linguaggio C Gestione File

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

Scrittura formattata - printf

File e puntatori a file

Programmazione Procedurale in Linguaggio C++

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

FONDAMENTI DI INFORMATICA. Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI. Facoltà di Ingegneria Università degli Studi di Udine

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

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

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Streams e disk files

FILE BINARI FILE BINARI

Gestione di files Motivazioni

Strutture Dati Dinamiche

ESERCIZIO 1 (5 punti) Convertire in binario il valore, espresso in decimale, Si usi la rappresentazione in virgola fissa.

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

Lezione 11: Liste a Puntatori e Input/Output

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

File binari, Operazioni sui File binari, Allocazione dinamica della memoria

Il linguaggio C. Breve panoramica su stdio.h

La gestione dell'errore

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

Fondamenti di Informatica

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Informatica (A-K) 23. Linguaggio C -8

Fondamenti di Informatica A. A / 1 9

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

File file di testo file binari

Indice. La gestione dei file in C e gli stream. Apertura e chiusura di un file. Operazioni sui file. Accesso sequenziale e non sequenziale

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

ARCHIVI E FILE. Prof. Ciaschetti

FILE SEQUENZIALI E AD ACCESSO DIRETTO

Tipi user-defined. parte dichiarativa globale:

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

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Input/output console file caratteri stringhe formattato ascii binari

Tipi definiti dall'utente

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

Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 9 File

Introduzione al C. Stream e disk file

Le strutture /1. struct temp {char titolo[200]; char autore[100]; int pagine; } ; typedef struct temp libro;

Corso di Fondamenti di Informatica Tipi strutturati: Stringhe

Transcript:

I file di dati Unità didattica D1 1

1) I file sequenziali Utili per la memorizzazione di informazioni testuali o binarie Noi ci occuperemo di file contenenti informazioni testuali In fondo ad un file sequenziale vi è sempre posizionato un carattere speciale di fine file EOF Non sono adatte per grandi quantità di dati per il dilatarsi dei tempi d accesso alle singole informazioni Unità didattica D1 2

1.1 Apertura e chiusura di file sequenziali Prima di poter effettuare qualsiasi operazione sui file è necessario aprire il file Al termine del suo utilizzo è necessario chiudere il file Apertura file: Un file sequenziale può essere aperto in vari modi possibili: r Solo lettura - se il file al momento dell apertura non esiste allora la funzione di apertura in r restituisce NULL w Solo scrittura - se il file al momento dell apertura non esiste allora sarà automaticamente creato - se il file al momento dell apertura esiste allora il contenuto del file preesistente andrà perso Unità didattica D1 3

1.1 Apertura e chiusura di file sequenziali Apertura file: r+ Lettura e Scrittura - se il file al momento dell apertura non esiste allora la funzione di apertura in r+ restituisce NULL w+ Lettura e Scrittura - se il file al momento dell apertura non esiste allora sarà automaticamente creato - se il file al momento dell apertura esiste allora il contenuto del file preesistente andrà perso a Append (sul file sarà possibile scrivere in fondo al file) - se il file al momento dell apertura non esiste allora sarà automaticamente creato - se il file al momento dell apertura esiste allora il contenuto del file preesistente rimarrà invariato a+ Lettura ed Append (sul file sarà possibile eseguire sia operazioni di lettura che di scrittura) - se il file al momento dell apertura non esiste allora sarà automaticamente creato - se il file al momento dell apertura esiste allora il contenuto del file preesistente rimarrà invariato Unità didattica D1 4

1.1) Apertura e chiusura di file sequenziali Sintassi per apertura file: <Identificatore>=fopen(<NomeFile>, <modalità>) <Identificatore> Variabile puntatore di tipo FILE detto file pointer,all interno del programma il programmatore deve usare il fiele pointer per accedere al file. <NomeFile> Stringa contenente il nome del file compreso il path (prova.txt;../prova.txt; c:/.../prova.txt; Dati/prova.txt) <Modalità> Uno dei modi visti in precedenza Nota: nel programma deve essere incluso stdio.h Unità didattica D1 5

1.1) Apertura e chiusura di file sequenziali Esempio di apertura: //Esempio di apertura di un file in sola lettura #include <stdio.h> void main () { FILE *fp; fp=fopen ("carattere.txt","r");.. //Esempio di apertura di un file in append #include <stdio.h> void main () { FILE *fp; fp=fopen ("../prova.txt", a");.. Unità didattica D1 6

1.1) Apertura e chiusura di file sequenziali Sintassi per chiusura file: fclose (<Identificatore>) <Identificatore> nome della variabile file pointer usato in apertura Esempio di chiusura: //Esempio di apertura di un file in sola lettura e successiva chiusura #include <stdio.h> void main () { FILE *fp; fp=fopen ("carattere.txt","r");.. fclose (fp).. Unità didattica D1 7

1.2) Operazione di lettura e scrittura di singoli caratteri su un file sequenziale Scrittura carattere su file E possibile operare in scrittura singoli caratteri su di un file precedentemente aperto utilizzando la seguente procedura: fputc(<carattere>, <Identificatore>) Nota: Tutti i caratteri che aggiungiamo successivamente in scrittura si accodano ai caratteri eventualmente già scritti. Lettura carattere da file E possibile operare in lettura singoli caratteri su di un file precedentemente aperto utilizzando la seguente funzione: <carattere> = fgetc(<identificatore>) Nota: Tutti i caratteri che leggiamo successivamente saranno quelli successivi al carattere appena letto. Vedi Esempio: Lettura e Scrittura Caratteri Unità didattica D1 8

1.3) Operazione di lettura e scrittura di stringhe su un file sequenziale Scrittura stringhe su file E possibile operare in scrittura singole stringhe su di un file precedentemente aperto utilizzando la seguente procedura: fputs(<stringa>, <Identificatore>) Nota: Tutti le stringhe che aggiungiamo successivamente in scrittura si accodano alle stringhe eventualmente già scritte. Lettura stringhe da file E possibile operare in lettura singole stringhe su di un file precedentemente aperto utilizzando la seguente procedura: fgets (<stringa>, <n caratteri>, <Identificatore>) n caratteri rappresenta il numero di caratteri-1 che si vuole leggere dal file (si deve tener conto del fine stringa, 1 carattere). Nota1: Tutte le stringhe che leggiamo successivamente saranno quelle successive alla stringa effettivamente appena letta. Nota2: Se compare un fine riga allora viene troncata l eventuale lettura della stringa alla lunghezza della riga. Vedi Esempio: Lettura e Scrittura Stringhe Unità didattica D1 9

1.4) I file con dati a blocco, accesso casuale (random) I file di questo tipo sono costituiti da un numero variabile di record accodati Si può immaginare di avere un archivio di schede ognuna delle quali rappresenta un record Unità didattica D1 10

1.4.1) Richiamo delle strutture Record Come già visto, i Record ci consentono di confluire sotto un unico nome dati non omogenei (di tipo diverso) Esempi: Dipendente Nome (stringa) Cognome (stringa) Livello (intero) Stipendio (float) Alunno Nome (stringa) Cognome (stringa) Classe (stringa) Matricola (intero) Unità didattica D1 11

1.4.1) Richiamo delle strutture Record Si ricorda che per dichiarare un nuovo tipo struttura si utilizza la seguente sintassi: struct <NomeStruttura> { <TipoCampo1> <NomeCampo1>; <TipoCampo2> <NomeCampo2>; <TipoCampoN> <NomeCampoN>; }; Unità didattica D1 12

1.4.1) Richiamo delle strutture Record Esempi: struct Studente { char nome[20]; char cognome[20]; char DataNascita[10]; int matricola; char sesso; }; struct Auto { char marca [20]; char modello[20]; int prezzo; int Anno_Imm; }; Note: Non è consentito l inizializzazione dei campi Non è consentito utilizzare un nome campo uguale al nome della struttura E consentito usare nomi campi uguali fra strutture diverse Si possono usare tipi di campo semplici o composti Unità didattica D1 13

1.4.1) Richiamo delle strutture Record Una volta creato un tipo struttura, è possibile dichiarare variabili del nuovo tipo definito utilizzando la normale sintassi di dichiarazione Esempio: Auto A1; Auto A2, A3; Per comodità è possibile creare un tipo e contestualmente dichiarare una o più variabili del tipo appena dichiarato Esempio: struct Studente { char nome[20]; char cognome[20]; char DataNascita[10]; int matricola; char sesso; } Alunno1, Alunno2, Alunno3; Unità didattica D1 14

1.4.1) Richiamo delle strutture Record In fase di dichiarazione delle variabili di tipo struttura, è possibile inizializzare i suoi campi Esempio: struct Studente { char nome[20]; char cognome[20]; char DataNascita[10]; int matricola; char sesso; } ; Studente Alunno1={ Marco, Rossi, 21-02-1980,2154, M }; Studente Alunno2={ Giulia, Marini, 2-08-1981,2158, F }; Unità didattica D1 15

1.4.1) Richiamo delle strutture Record Per riferirsi ad un particolare campo di una variabile di tipo struttura, si utilizza la notazione punto (.) <NomeVariabile>.<NomeCampo> Esempi: Alunno2.matricola=2157; strcpy(alunno3.nome, Matteo ); Alunno3.sesso= M X=A1.prezzo; A differenza degli Array, per le strutture è definito l operatore di assegnazione, pertanto è consentito eseguire la seguente assegnazione: Alunno=Alunno3; //Ho creato una copia dei dati relativi all alunno3 nella struttura della variabile Alunno //precedentemente dichiarate dello stesso tipo Studente Unità didattica D1 16

1.4.2) Richiamo delle strutture Array di Record: le Tabelle E possibile creare strutture dati più complesse mettendo insieme array e strutture. Se consideriamo un array di record otterremo quella che viene chiamata tabella. Esempio: struct Auto { char marca [20]; char modello[20]; int prezzo; int Anno_Imm; }; Auto Concessionaria[10]; Unità didattica D1 17

1.4.2) Richiamo delle strutture Array di Record: le Tabelle Gli array di strutture prendono il nome di tabelle in quanto possono essere viste come strutture tabellari: Concessionaria marca modello prezzo Anno_Imm 0 1 2 3 4 5 6 7 8 9 Unità didattica D1 18

1.4.3) I file con dati a blocco, accesso casuale (random) I file con dati a blocco sono da immaginare come grossi array di record, ogni record rappresenta un blocco all interno del file. La dimensione in byte del singolo record (come ogni tipo di dato) viene ricavata utilizzando la funzione sizeof() Esempio: sizeof(<struttura>); DimRecord=sizeof(Alunno3); Unità didattica D1 19

1.4.3) I file con dati a blocco, accesso casuale (random) char nome[20]; char cognome[20]; char DataNascita[10]; int matricola; char sesso; DimRecord = sizeof(alunno3) Otteniamo DimRecord = 60 byte (leggermente superiore alla somma dei byte occupati dai singoli campi) Se all interno del nostro file riponiamo 40 blocchi record di tipo Studente abbiamo una dimensione file pari a 40*60=2400byte=2,4Kbyte Unità didattica D1 20

1.4.3) I file con dati a blocco, accesso casuale (random) Analogamente a quanto avveniva per i file ad accesso sequenziale, anche per questi tipi di file l accesso avviene in modo sequenziale a meno di utilizzare opportune funzioni/procedure di posizionamento Procedura fseek() posiziona il file-pointer nella posizione desiderata al fine di coperare sul blocco voluto. fseek(<identificatore>, <Numero_byte>, <Modalità>) Identificatore file pointer Numero byte Numero byte di cui si vuole spostare il file-poiter Modalità 0 (spostamento dall inizio file) 1 (spostamento dalla posizione corrente) 2 (spostamento dalla fine del file) Unità didattica D1 21

1.4.3) I file con dati a blocco, accesso casuale (random) Funzione ftell() restituisce la posizioe corrente del file-pointer. ftell(<identificatore>) Identificatore file pointer Esempio: determina il numero di record (blocchi) presenti in un file contenente Studenti definiti secondo la struttura precedentemente indicata: fseek(fp, 0, 2); dim_file = ftell(fp); n_record = dim_file/dim_record; Vedi esempio: Dim_File_Classe.cpp Unità didattica D1 22

1.4.4) I file con dati a blocco, Lettura record L operazione di lettura di record viene effettuata tramite la funzione: N = fread(<ind_variabile>, <Dim_Blocco>, <Num_Blocchi>, <Identi.>) Ind_Variabile Dim_Blocco Num_Blocchi Identi. N Indirizzo della struttura dati che dovrà ospitare i blocchi che si vuole leggere. Esempi: &Alunno leggere un solo blocco record; Classe leggere più blocchi record da riporre in una struttura Array di Record (Classe[]); Dimensione in byte del singolo blocco (ricavabile con sizeof() ) Numero di Blocchi che si vogliono leggere (1 o più) File-Pointer del file sul quale si vuole operare in lettura Numero di Blocchi effettivamente letti Unità didattica D1 23

1.4.4) I file con dati a blocco, Lettura record Esempio di Lettura singolo record: fp = fopen ( "Classe4A.txt", "r" ); cout << "Inserire la matricola dello studente che si vuole visualizzare: "; cin >> mat; dim_record=sizeof(struct Studente); posizione = dim_record*(mat-1); //mi posiziono con il file-pointer prima del record da leggere fseek(fp,posizione, 0); //Leggo il record che mi interessa fread(&alunno, dim_record, 1, fp); fclose(fp); Vedi codice esempio: Lettura_Studente.cpp Unità didattica D1 24

1.4.4) I file con dati a blocco, Lettura record Esempio di Lettura dell intero file: Studente Classe [50]; dim_record=sizeof(struct Studente); fp = fopen ( "Classe4A.txt", "r" ); //determino il numero di record presenti nel file fseek(fp, 0, 2); dim_file = ftell(fp); n_record = dim_file/dim_record; //mi riposiziono all'inizio del file fseek(fp, 0, 0); //leggo l intero file e ripongo i record nella prima parte del vettore Classe[] N = fread(classe, dim_record, n_record, fp); cout << "Sono stati letti: " << N << " byte dal file" << endl; fclose (fp); Vedi codice esempio: Lettura Intero file.cpp Unità didattica D1 25

1.4.5) I file con dati a blocco, Scrittura record L operazione di scrittura di record viene effettuata tramite la funzione: N = fwrite(<ind_variabile>, <Dim_Blocco>, <Num_Blocchi>, <Identi.>) Ind_Variabile Dim_Blocco Num_Blocchi Identi. N Indirizzo della struttura da cui attingere i blocchi che si vuole scrivere Esempi: &Alunno scrive un solo blocco record; Classe scrive più blocchi record da prelevare da una struttura Array di Record (Classe[]); Dimensione in byte del singolo blocco (ricavabile con sizeof() ) Numero di Blocchi che si vogliono scrivere (1 o più) File-Pointer del file sul quale si vuole operare in scrittura Numero di Blocchi effettivamente scritti Unità didattica D1 26

1.4.5) I file con dati a blocco, Scrittura record Esempio di scrittura singolo record: Studente Alunno; fp = fopen ( "Classe4A.txt", "a" ); dim_record=sizeof(alunno); //acquisizione dei dati di un singolo studente cout << "Inserire il Nome: "; cin >> Alunno.nome; cout << "Inserire il Cognome: "; cin >> Alunno.cognome; cout << "Inserire la data di Nascita: "; cin >> Alunno.DataNascita; cout << "Inserire la matricola: "; cin >> Alunno.matricola; cout << "Inserire il Sesso: "; cin >> Alunno.sesso; cout << endl; // accodo il record dello studente nel file Classe4A.txt N = fwrite (&Alunno, dim_record, 1, fp ); cout << "Sono stati scritti: " << N << " studenti nel file" <<endl; fclose (fp); Vedi codice esempio: Scrittura_Studente.cpp Unità didattica D1 27

1.4.6) Operazione di lettura e scrittura di dati semplici (non record) Lettura di dati semplici da file E possibile operare in lettura più dati omogenei semplici analogamente a quanto già fatto per la lettura di dati strutture. Esempio 1: Esempio 2: char Vettore [150]; fp = fopen ( "testo.txt", "r" ); //Leggo 10 catatteri dal file (ogni carattere 1 byte) N = fread (Vettore, 1, 10, fp ); int Vettore [150]; fp = fopen ( "Numeri.dat", "r" ); //Leggo 10 numeri interi dal file N = fread (Vettore, sizeof(int), 10, fp ); for (i=0; i<10; i++) cout << Vettore[i] << endl; Vedi Esempio: Lettura_Dati_Semplici.cpp; LetturaNumeri.cpp; Unità didattica D1 28

1.4.6) Operazione di lettura e scrittura di dati semplici (non record) Scrittura di dati semplici da file E possibile operare in scrittura più dati omogenei semplici analogamente a quanto già fatto per la scrittura di dati strutture. Esempio 1: Esempio 2: char Vettore [150] = {"Inviato: soluzione Titolo: soluzione "} fp = fopen ( "testo.txt", "w" ); dim_elem = sizeof(vettore[0]); N = fwrite (Vettore, dim_elem, 36, fp ); fclose (fp); int Vettore [150] = {23, 46, 34, 12, 890, 2345, 234, 345, 32, 12}; fp = fopen ( "Numeri.dat", "w" ); dim_elem = sizeof(int); // OPPURE: dim_elem = sizeof(vettore[0]); N = fwrite (Vettore, dim_elem, 10, fp ); cout << "Sono stati scritti: " << N << " elementi"; fclose (fp); Vedi Esempio: Scrittura_Dati_Semplici.cpp; ScritturaNumeri.cpp; Unità didattica D1 29

1.5) La cancellazione logica e la cancellazione fisica All interno di un file random, i record non possono essere cancellati fisicamente a meno di ricopiare l intero file in un nuovo file escludendo i record che si vogliono cancellare fisicamente. Si ricorre quindi all artificio di effettuare una cancellazione logica dei record che non interessano e successivamente si effettua una cancellazione fisica con la tecnica della riscrittura di un nuovo file. Unità didattica D1 30

1.5) La cancellazione logica e la cancellazione fisica Cancellazione Logica: Nella definizione del record da usare, viene inserito un campo Cancellato ad esempio di tipo booleano usato per contrassegnare i record che si vogliono cancellare logicamente pur lasciandoli all interno del file. Il programma sarà scritto in modo tale da considerare: cancellati tutti i file che conterranno il campo Cancellato a True (1) non cancellati i record che conterranno il campo Cancellato a False. (0) Unità didattica D1 31

1.5) La cancellazione logica e la cancellazione fisica Esempio: struct Studente { char nome[20]; char cognome[20]; char DataNascita[10]; int matricola; char sesso; int Cancellato; } Alunno; dim_record=sizeof(struct Studente); posizione = dim_record*(12-1) //mi posiziono con il file-pointer prima del record 12 da leggere fp = fopen ( "Classe4A.txt", "r" ); fseek(fp,posizione, 0); fread(&alunno, dim_record, 1, fp); //Leggo il record che mi interessa fclose(fp); Alunno.Cancellato=1; fp = fopen ( "Classe4A.txt", w" ); fseek(fp,posizione, 0); fwrite(&alunno, dim_record, 1, fp); fclose(fp); Si è operata la cancellazione logica dello studente posto nella posizione 12 all interno del file (senza eliminarlo fisicamente) Unità didattica D1 32