APPUNTI SUL LINGUAGGIO C Memoria secondaria: File

Slides:



Advertisements
Presentazioni simili
File Linguaggio C.
Advertisements

Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Gestione dei file Ing. Simona Colucci.
Operazioni di I/O da console e da file in C standard
1 Directory Il formato delle directory varia nei vari FS utilizzati in ambito Unix Quando una directory viene aperta viene restituito un puntatore a un.
SC che operano su file (1)
Anno accademico Input e Output in C. Anno accademico Sommario Input e outputInput e output I flussi di I/O I flussi di I/O Luso.
INFORMATICA I file.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
FILE DATI 16 lunedi 26 luglio giovedi ore 9 Come sappiamo, un file dati è un gruppo di informazioni tra loro correlate, memorizzate in un dispositivo di.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 15 Maggio 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 9 Maggio 2012.
INFORMATICA I file. © Piero Demichelis 2 File Per rendere più uniforme possibile il comportamento dei programmi in relazione alla grande varietà dei dispositivi.
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
1 Gestione dei File Corso di Informatica A Vito Perrone.
File di testo, file binari
I File.
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
Esercizi su File.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 11 (Deitel) Lelaborazione dei file Sommario Introduzione La gerarchia dei dati 11.3.
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 13 e 14 GESTIONE DEI FILE A) Nozioni sulla gestione dei.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 13 e 14 -
Fondamenti di Informatica L- A #include “mylib.h” int leggi(int a[], int dim) { int i=0; while( scanf("%d", a+i) ) { i++; if( i>=dim ) break; } return.
Capitolo 14 Diapositiva 1 Linguaggio C – Guida alla programmazione 2/ed – A. Bellini, A. Guidi Copyright © The McGraw-Hill Companies srl Archiviare.
11. Gestione dei file Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
11. Gestione dei file Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Approfondimenti di C, Stringhe e file 13 Stringhe.
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 6 Marzo 2016.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Introduzione al linguaggio C
Tutorato Elementi di Informatica 2013
Process synchronization
Organizzazione fisica
I FILES AD ACCESSO SEQUENZIALE
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Ambienti di Programmazione per il Software di Base
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
I FILE di dati in C#.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
File System ed Input/Output
APPUNTI SUL LINGUAGGIO C
La struttura dei primi programma in C
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Le stringhe in C++ Laboratorio 26 Aprile Dott. Serena Villata
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Programmazione e Laboratorio di Programmazione
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

APPUNTI SUL LINGUAGGIO C Memoria secondaria: File Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Memoria secondaria: File

Gestione della memoria secondaria La gestione della memoria secondaria in un linguaggio di programmazione consente la memorizzazione permanente dei dati e la loro condivisione tra programmi diversi. Questo è utile quando: la mole dei dati non consente la gestione in memoria principale i dati hanno un’esistenza indipendente dalle esecuzioni dei programmi che li utilizzano. In memoria secondaria i dati sono organizzati in file.

Un file è un contenitore di informazione permanente. La “vita” di un file è indipendente dalla vita del programma che ne fa uso. Un file continua ad esistere anche dopo il termine dell’esecuzione del programma.

Record File File: a livello logico è una sequenza (insieme) di record. Data ora minuti secondi Record File

File: a livello logico è una sequenza (insieme) di record. Il metodo di accesso a un file è la tecnica usata dal programma per accedere ai record del file. EOF 1 2 ... n-1 marcatore di fine file Il C vede in questo modo un file: una sequenza di byte con un marcatore alla fine per indicare la fine del file.

File Un programma C prima di poter utilizzare un file deve aprire un flusso di comunicazione. Al termine dell’utilizzo di un file il flusso di comunicazione viene chiuso. Flusso di Caratteri Flusso Binario

Dichiarazione di file in C Definizione File Dichiarazione di file in C FILE *fp; Definisce una variabile di tipo "puntatore a file".

Gestione File C Nel linguaggio C: • un file è semplicemente una sequenza di byte, • ogni dispositivo fisico viene visto come un file. Funzioni per la gestione dei file in ANSI C • fopen, fclose; • fgetc, fputc; • fgets, fputs; • fprintf, fscanf; • fread, fwrite; • fseek, fsetpos; • ftell, fgetpos; Contenute nella libreria: stdio.h

Apertura di un file La funzione fopen "apre" un file ovvero lo predispone ad una certa elaborazione e inizializza una area di memoria (detta buffer o canale) attraverso la quale vengono scambiati i dati tra memoria principale e secondaria. E' una operazione che deve essere effettuata sempre prima di ogni tipo di elaborazione sul file. Se l'apertura del file non ha successo la funzione restituisce NULL.

Apertura di un file È possibile specificare la modalità di apertura di un file attraverso uno dei seguenti caratteri: · r [read] il file deve già esistere; viene aperto in lettura e viene restituito il puntatore all'inizio del file; • w [write] il file viene creato se non esiste o viene sovrascritto se esiste; viene aperto in scrittura e viene restituito il puntatore all'inizio del file; • a [append] il file viene creato se non esiste; viene aperto in scrittura con inserimenti solo in fondo al file e viene restituito il puntatore alla fine del file; • + [update] si usa in combinazione con una delle prime tre modalità; permette l'aggiornamento del file; • b [binary] si usa in combinazione con una delle prime tre modalità; permette la gestione di dati in formato binario;

Apertura di un file r EOF dati w dati EOF dati a dati già presenti prossime scritture EOF

FILE * fopen(nomefile, modalità) Apertura di un file FILE * fopen(nomefile, modalità) nomefile - stringa che indica il nome del file modalità - modalità di apertura: “r” - Lettura (testo) “w” - Scrittura (testo) “a” - Scrittura a fine file (testo) “rb” - Lettura (binario) “wb” - Scrittura (binario) “ab” - Scrittura a fine file (binario) “r+”, “w+”, “a+” – Lettura e Scrittura (testo) “rb+”, “wb+”, “ab+” – Lettura e Scrittura (binario)

Chiusura di un file La funzione fclose "chiude" un file ovvero lo rilascia chiudendo il relativo canale di comunicazione. Se la chiusura del file non ha successo la funzione restituisce NULL. E' una operazione che deve essere effettuata sempre alla fine delle elaborazione sul file.

fp puntatore al file da chiudere Chiusura di un file int fclose(FILE * fp) fp puntatore al file da chiudere

fp = fopen("dati.txt","r+"); Chiusura di un file Esempio: FILE *fp; .... fp = fopen("dati.txt","r+"); fclose(fp);

Acceso Sequenziale File C Un file è una sequenza di dati, e tutte le operazioni su questi partiranno dall’inizio e si muoveranno in sequenza fino alla fine del file dati marcatore di fine file • Operazioni di input/output; • Operazioni di lettura e scrittura.

Lettura e scrittura di un file La funzione fputc scrive un singolo carattere in un file. Restituisce il carattere stesso se l'operazione è andata a buon fine, altrimenti restituisce EOF (costante speciale il cui valore non è significativo). int fputc(int c, FILE *pf) c – carattere da scrivere sul file pf – puntatore al file valore di ritorno: EOF – in caso di errore c – operazione OK

Lettura e scrittura di un file Esempio: /* scrive in un file i caratteri in input */ #include<stdio.h> main() { FILE *fp; int c; fp=fopen("dati.txt","w"); if (fp==NULL) printf("Errore di I/O"); else while((c = getchar()) != '\n') fputc(c,fp); fclose(fp); }

Lettura e scrittura di un file La funzione fgetc legge un carattere dal file specificato. Restituisce il carattere letto (come intero) se l'operazione è andata a buon fine, altrimenti restituisce EOF se si è raggiunta la fine del file. int fgetc(FILE * pf) pf – puntatore al file valore di ritorno – carattere letto

Lettura e scrittura di un file Esempio: /*copia il contenuto di un file in un altro*/ #include<stdio.h> main() { FILE *ifp, *ofp; int c; ifp=fopen("dati.txt","r"); ofp=fopen("copia.txt","w"); while((c = fgetc(ifp)) != EOF) fputc(c,ofp); fclose(ofp); fclose(ifp); }

Lettura e scrittura di stringhe La funzione fgets legge un numero specificato di caratteri da un file e li memorizza in una stringa aggiungendo il carattere di fine stringa. Restituisce la stringa se l'operazione è andata a buon fine, altrimenti restituisce NULL. char * fgets(char *s, int n, FILE *fp) s – puntatore al vettore su cui vengono inseriti i caratteri letti n – vengono letti n-1 caratteri, o fino a newline o fino alla fine del file fp – puntatore al file su cui leggere valore di ritorno s – operazione a buon fine NULL - altrimenti

Lettura e scrittura di stringhe Esempio: /* stampa i primi 10 caratteri di un file */ #include <stdio.h> main() { FILE *fp; char str[11]; if ((fp=fopen("dati.txt","r"))==NULL) printf("Errore di I/O"); else if(fgets(str,sizeof(str),fp)!=NULL) printf("%s",str); fclose(fp); }

Lettura e scrittura di stringhe La funzione fputs scrive una stringa nel file specificato senza aggiungere il carattere di fine stringa. Restituisce 0 se l'operazione è andata a buon fine, altrimenti restituisce EOF. int fputs(char *s, FILE *fp) s – puntatore al vettore degli elementi che saranno inseriti fp – puntatore al file su cui inserire gli elementi. valore di ritorno 0 – operazione OK EOF - altrimenti

Lettura e scrittura di stringhe Esempio: /* appende una stringa in un file */ #include <stdio.h> main() { FILE *fp; if ((fp=fopen("dati.txt","a"))==NULL) printf("Errore di I/O"); else if(fputs("Fine",fp)==EOF) printf("Errore in scrittura"); fclose(fp); }

Operazioni di I/O formattate su file La funzione fscanf legge caratteri da un file secondo il formato specificato e assegna i valori letti ai suoi successivi argomenti. Restituisce il numero di caratteri letti se l'operazione è andata a buon fine, altrimenti restituisce EOF. int fscanf(FILE *pf, str_cont, elementi)

Operazioni di I/O formattate su file La funzione fprintf scrive caratteri in un file secondo il formato specificato. Restituisce il numero di caratteri scritti se l'operazione è andata a buon fine, altrimenti restituisce un valore negativo. int fprintf(FILE *pf, str_cont, elementi)

pf=fopen("pippo.txt","w"); fprintf(pf, "%s", "ciao"); fclose(pf); #include <stdio.h> main(){ FILE * pf; char v[30]; pf=fopen("pippo.txt","w"); fprintf(pf, "%s", "ciao"); fclose(pf); pf=fopen("pippo.txt","r"); fscanf(pf,"%s",v); printf("%s",v); }

Esempio: /* memorizza una sequenza di interi in un file, scrivendoli uno per riga */ #include<stdio.h> main() { FILE *fp; int dato, n, i; if ((fp=fopen("dati.txt","w"))==NULL) printf("Errore di I/O"); else { printf("N.dati da inserire:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("Dato n. %d:",i+1); scanf("%d",&dato); fprintf(fp,"%d\n",dato); } fclose(fp);

Funzioni di gestione di errori su file Quando si rileva un errore in una operazione di accesso a file, viene aggiornato degli "indicatori di stato" (fine file ed errore su file). Inoltre, la variabile intera errno (in <errno.h>) registra un numero che da indicazioni sul tipo di errore. La funzione feof restituisce un valore diverso da 0 se è stata raggiunta la fine del file, altrimenti restituisce 0. La funzione ferror restituisce un valore diverso da 0 se è si è verificato un errore sul file, altrimenti restituisce 0. La funzione perror stampa una stringa specificata seguita da un messaggio che indica il tipo di errore commesso.

Esempio: #include<stdio.h> main() { FILE *ifp, *ofp; int c; ifp=fopen("dati.txt","r"); if (ferror(ifp)) { perror("Errore di I/O:"); return; } ofp=fopen("copia.txt","w"); c = fgetc(ifp); while(!feof(ifp)) { fputc(c,ofp); fclose(ofp); fclose(ifp);

File speciali Stdin : standard di input (tastiera) Stdout : standard di output (monitor) Stderr : standard di errore (spesso sempre il monitor) Sono predefiniti e non è necessario ne dichiararli ne ridefinirli.

Accesso casuale I record di un file creati con l’output formattato della funzione fprintf non avranno necessariamente la stessa lunghezza: la modalità di accesso poi a questi file è di tipo sequenziale (dall’inizio alla fine). Un file ad accesso casuale invece presenta record di lunghezza fissa e vi si potrà accedere in modo diretto (e quindi velocemente), senza passare attraverso altri record. 100 200

Funzioni di I/O diretto su file: Accesso casuale La funzione fread legge da un file un numero specificato di oggetti di una certa ampiezza e li memorizza in un vettore. Restituisce il numero di oggetti letti. int fread (void *buf, int size, int count, FILE *fp); *buf è il puntatore alla regione di memoria dove andranno archiviati i dati da leggere; size è la lunghezza del singolo dato; count è il numero dei dati; *fp è il file sorgente

Funzioni di I/O diretto su file: Accesso casuale La funzione fwrite scrive su un file un numero specificato di oggetti di una certa ampiezza, prelevandoli da un vettore. Restituisce il numero di oggetti scritti. int fwrite (void *buf, int size, int count, FILE *fp); *buf è il puntatore alla regione di memoria sorgente; size è la lunghezza del singolo dato; count è il numero dei dati; *fp è il file su cui scrivere

Funzioni di posizionamento su file La funzione fseek determina una posizione su un file. Le successive istruzioni di I/O sul file operano a partire da questa posizione. Si specifica uno spiazzamento s e un’origine o: la posizione è a s byte a partire da o. La funzione restituisce un valore nullo in caso di errore. int fseek (FILE *fp, long s, int o); La funzione ftell restituisce la posizione corrente su un file (0 se all’inizio), oppure, in caso di errore, un numero negativo. long ftell (FILE *fp);

MODALITA' OPERATIVE DI fseek() Significato Costante Significato SEEK_SET lo spostamento avviene a partire dall'inizio del file.  SEEK_CUR lo spostamento avviene a partire dall'attuale posizione.  SEEK_END lo spostamento avviene a partire dalla fine del file.  int fseek (FILE *fp, long s, int o); La fseek() restituisce 0 se l'operazione riesce; in caso di errore è restituito un valore diverso da 0. 

Dato un file di testo mesi Dato un file di testo mesi.txt, si supponga che sia costituito da righe ciascuna contenente una stringa (nome del mese) ed un intero (numero di giorni). Si stampino a video i nomi dei mesi che hanno 31 giorni. mesi.txt Gennaio 31 Marzo 31 Febbraio 28 Dicembre 31 Novembre 30

Accesso sequenziale mesi.txt Gennaio 31 <stringa> <int> Marzo 31 Febbraio 28 Dicembre 31 Novembre 30 <stringa> <int> … … Accesso sequenziale

#include <stadio.h> #include <stlib.h> main() { char nome[20]; int giorni; FILE* f; f=fopen("mesi.txt“,"r“); if (f==NULL) { printf("Il file non esiste!"); exit(1); } while (fscanf(f,"%s %d\n", nome, &giorni) != EOF) if (giorni == 31) printf ("%s\n", nome); fclose(f); }

Dato un file binario mesi Dato un file binario mesi.dat, si supponga che contenga strutture così configurate: una stringa (nome del mese) ed un intero (numero di giorni); si memorizzi il contenuto del file in un vettore di strutture e si stampino a video i nomi dei mesi che hanno 31 giorni. mesi.dat Gennaio 31 Marzo 31 Febbraio 28 Dicembre 31 Novembre 30

Accesso casuale mesi.dat Gennaio 31 <stringa> <int> Marzo 31 Febbraio 28 Dicembre 31 Novembre 30 <stringa> <int> … … Accesso casuale

#include <stadio.h> #include <stlib.h> typedef struct {int giorni; char nome [20];} mese; main() { int i; mese v[12]; /* al massimo saranno 12*/ FILE* f=fopen("mesi.dat","rb"); if (f==NULL) { printf("Il file non esiste!"); exit(1); } while (fread(&v[i],sizeof(mese),1,f) >0) { if (v[i].giorni == 31) printf("%s\n",v[i].nome); i++; } fclose(f);

alunni.txt alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10 MRTD 8 YTRG 8 Dato un file di testo alunni.txt, si supponga che sia costituito da righe ciascuna contenente una stringa (matricola dell’alunno) ed un intero (numero esami superati). Si dia da input una matricola: settare il numero di esami dell’alunn con quela matricola incrementandolo di uno. alunni.txt alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10 MRTD 8 YTRG 8 HHYU 6 JJJII 10 YTRG

#include <stadio.h> #include <stlib.h> #include <string.h> main() { char matr[20]; char matr2[20]; int esami; int test = 0; long pos; scanf(“%s\n”,matr); FILE* f; f=fopen(“alunni.txt“,"r+“); if (f==NULL) { printf("Il file non esiste!"); exit(1); }

matr = YTRG alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10

while ((!test)&&(!feof)) { pos = ftell(f); fscanf(f,"%s %d\n", matr2, &esami); if (strcmp(matr,matr2)) { fseek(f,pos,SEEK_SET); esami++; fprintf(f,"%s %d\n", matr2, esami); test=1; } } fclose(f);

alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10 pos matr = YTRG MRTD 8 YTRG 7 HHYU 6 JJJII 10 matr = YTRG matr2 = MRTD pos

alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10 matr = YTRG pos MRTD 8 YTRG 7 HHYU 6 JJJII 10 matr = YTRG matr2 = YTRG pos

alunni.txt MRTD 8 YTRG 7 HHYU 6 JJJII 10 matr = YTRG matr2 = YTRG pos MRTD 8 YTRG 8 HHYU 6 JJJII 10 pos