Input/Output su disco

Documenti analoghi
Laboratorio di Programmazione

Gestione dei file in C

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

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Gestione dei File. Credits Prof. Campi

Corso di Informatica A.A

I files in C. A cura del prof. Ghezzi

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

Input/Output su File

Streams e disk files

Gestione dei file in C

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

FILE BINARI FILE BINARI

file fisico file logico

Linguaggio C: i file

Perchè i files? Realizzano la persistenza dei dati. Sono delle strutture di dati sequenziali. dati che sopravvivono all esecuzione del programma

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

INFORMATICA. I file. File. File. File

File binari e file di testo

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

Il linguaggio C. Breve panoramica su stdio.h

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

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Settimana n.12. Obiettivi File!di!testo. Contenuti Concetto!di!file!e!funzioni! fopen/fclose Funzioni!fgets+sscanf Approfondimenti!su!printf! e!

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

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

Lezione 22: Input/Output e Files

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

Lettura da tastiera e scrittura su monitor

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

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

Files in C endofile

Lezione 11: Liste a Puntatori e Input/Output

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ELEMENTI DI INFORMATICA. Linguaggio C

Cosa serve per cominciare?

Scrittura formattata - printf

Dati due punti sul piano calcolare la loro distanza

Operazioni su file di caratteri

Gestione dei files in linguaggio C. Fondamenti

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

Le strutture /3. Riprendiamo ora la struttura definita alcune lezioni fa e completiamo il set di funzioni che servono per gestire un elenco di libri.

FILE SEQUENZIALI E AD ACCESSO DIRETTO

Introduzione al C. Stream e disk file

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

La gestione dei file in C

Laboratorio di Informatica

Lezione V Fondamenti di Ingresso/Uscita

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

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

Esercitazione di Reti degli elaboratori

Dispensa 25 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN SCIENZE E TECNOLOGIE INFORMATICHE CESENA. Laboratorio

Laboratorio di Informatica Ingegneria Clinica Lezione 30/11/2011

Sistemi Operativi (M. Cesati)

GESTIONE DEI FILE IN C

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

File. Molto astratta: file ha un nome (ex. Pippo.c), ed altre caratteristiche (dimensione, tipo, etc). Operazioni: copiare, cancellare, eseguire..

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

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

Capitolo 11 Elaborazione di file

GESTIONE DEI FILE. File come tipo di dati

I puntatori. Il C ci permette di conoscere tale indirizzo, ovvero di determinare dove la variabile sia stata effettivamente memorizzata.

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

Esercitazioni Fondamenti di Informatica

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

puntatori Lab. Calc. AA 2006/07 1

File e puntatori a file

INPUT E OUTPUT DI VALORI NUMERICI

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

Puntatori. Grazie ai puntatori:

Sistemi Operativi (M. Cesati)

Premessa. Input /output e gestione dei file. I file e gli stream. Il puntatore al file. 21. I FILE NEL LINGUAGGIO C Versione 1.

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

Input/output console file caratteri stringhe formattato ascii binari

File qualche nota riassuntiva Che cos è un file? È un astrazione fornita dal sistema operativo, per consentire la memorizzazione di informazioni su

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Sistemi Operativi (M. Cesati)

Laboratorio di informatica Ingegneria meccanica

FILE BINARI FILE BINARI

- matrici - stringhe - file (lettura/scrittura, di testo/binari) - strutture, puntatori - allocazione dinamica della memoria (malloc)

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

Esercizi. I File ed il C

I puntatori /2. Ad esempio. // inizio codice. #include <stdio.h> void mostra(int); int main() {int a = 10; mostra(a); return 0;}

Caratteri e stringhe

File. Unità 8. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Gestione dei File C. Generalità

Costruiamo un programma per crittografare del testo

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

Gestione di files Motivazioni

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Gestione dei File. dischi nastri cd

Il buffer di input. In questo modo, tutte le chiamate alla funzione permetteranno all'utente di inserire caratteri.

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

Gestione File di testo

Transcript:

Input/Output su disco In C, la gestione dei dispositivi di lettura (tastiera, file su disco,...) e scrittura (monitor, file su disco, stampante,...) viene effettuata mediante canali di comunicazione. Tali canali possono essere sia di input o di output (a seconda che il flusso di informazioni avvenga dal canale verso il codice o dal codice verso il canale) e rappresentano una sorta di interfaccia tra il codice ed il dispositivo fisico cui si vuole accedere dall'interno del codice stesso. In questo modo, le operazioni di accesso ai singoli dispositivi diventano indipendenti dalle caratteristiche tecniche di tali dispositivi; ad esempio, la scrittura su monitor e quella su file vengono effettuate utilizzando lo stesso set di funzioni, permettendo al programmatore di non curarsi di come il processo di scrittura venga effettivamente portato a termine. In generale, prima di poter comunicare con un dispositivo è necessario attivare un canale di comunicazione; nel caso in cui il programma debba accedere alla tastiera o al monitor, non è necessario effettuare tale apertura, in quanto tastiera e monitor rappresentano i canali di input ed output standard, stdin e stdout, e risultano automaticamente aperti all'avvio del programma. L'apertura del canale potrà avvenire in modalità di scrittura o lettura ed il flusso di informazioni potrà essere gestito in modalità testo o binaria.

Scrittura su file La scrittura di informazioni all'interno di un documento memorizzato sull'hard-disk del computer è possibile dopo aver attivato il canale di comunicazione con tale documento in modalità scrittura. Nel caso il flusso di informazioni venga gestito in modalità testo, l'invio di informazioni al file avviene per caratteri (non nel senso che si può scrivere solo un carattere per volta, ma nel senso che, una volta inviata un'informazione al file, essa viene salvata sotto forma di un insieme di caratteri). Ad esempio, il valore 123.45, una volta salvato su file, diventa una sequenza di caratteri: '1', '2', '3', '.', '4' e '5'. Le funzioni di gestione dell'output permettono di inviare su file dei dati: 1. carattere per carattere, usando la funzione int putc(int c,file*output) che permette di inviare il carattere c al dispositivo cui è collegato il canale output 2. in modalità formattata, usando la funzione in fprintf(file*output, "stringa di formato",...) che permette di inviare l'output sfruttando le medesime potenzialità della funzione printf() 3. una stringa alla volta, usando la funzione char *fputs(char*stringa,file* output) Vediamo tre esempi in cui l'output venga inviato su disco in questi tre diversi modi. /* inizio codice */ #include <stdio.h> #include <stdlib.h> int main() {int i; char *stringa_di_prova="prova di invio dati carattere per carattere"; FILE *output; /* questa è la variabile da utilizzare per l'invio di dati al canale di comunicazione con il file. prima di iniziare la comunicazione con il documento su disco è necessario attivare il canale di comunicazione, specificando il nome del documento e la modalità di accesso al documento stesso */ output = fopen("prova_char_a_char.txt","w"); /* accediamo al dispositivo in scrittura

*/ if(output ==NULL) /* verifico che il canale sia attivo */ {printf("\n apertura fallita"); exit(0); /* ora è possibile accedere al documento */ i=0; while( *(stringa_di_prova+i) ) /* eseguo il ciclo fino al raggiungimento dell'ultimo char */ {putc( *(stringa_di_prova+i), output ); i++; /* ora inserisco un carattere "a capo" */ putc('\n', output ); /* ora inserisco la stringa al contrario */ i--; while( i >= 0 ) /* eseguo il ciclo fino al raggiungimento del primo char */ {putc( *(stringa_di_prova+i), output ); i--; /* Ora iniziamo le operazioni di scrittura usando la funzione fprintf() */ fprintf(output,"\n iniziano le operazioni di scrittura mediante fprintf()\n"); fprintf(output,"\n valore casuale compreso tra 0 e 999: %d", rand() % 1000); fprintf(output,"\n una stringa: %s\n",stringa_di_prova); /* Ora iniziamo le operazioni di scrittura usando la funzione fputs() */ fputs("\n ora scrivo su file, una stringa per volta\n",output); fputs(stringa_di_prova,output); /* Ora chiudiamo il canale di comunicazione. Se ci dimenticassimo di farlo, esso verrebbe automaticamente chiuso al termine del programma */ fclose(output); return 0; /* fine codice */ Qual è ora il contenuto del file prova_char_a_char.txt? Proviamo ad aprirlo con un qualsiasi editor di testo... Prova di invio dati carattere per carattere erettarac rep erettarac itad oivni id avorp iniziano le operazioni di scrittura mediante fprintf() valore casuale compreso tra 0 e 999: 41 una stringa: Prova di invio dati carattere per carattere ora scrivo su file, una stringa per volta Prova di invio dati carattere per carattere

Notate che nel testo non si vedono esplicitamente i caratteri '\n', a capo; se ne nota però l'effetto. Questo indica che, quando un file viene letto in modalità testo, alcuni dei caratteri, i cosiddetti caratteri di controllo, possono essere interpretati e non visualizzati. Lettura da file Le operazioni di input da file possono essere effettuate con le stesse modalità cui cui esse venivano effettuate a partire dal buffer di input standard, ovvero carattere per carattere, a gruppi di caratteri (il separatore tra gruppo e gruppo è rappresentato dal carattere ' ') e stringa per stringa. Per capire quando si sia raggiunta la fine del file, identificata dal carattere EOF, è utile considerare i valori restituiti dalle funzioni di lettura: int fgetc(file*input) restituisce il carattere letto dal canale input o EOF, se incontra la fine del file o se si verifica un errore int fscanf(file*input,"stringa di formato") restituisce un numero pari al numero di caratteri letti o EOF se durante la lettura viene incontrata la fine del file char *fgets(char*stringa,int numero,file* input) la funzione preleva dal canale input un numero di caratteri che al massimo è costituito da numero-1 elementi e li copia nell'area di memoria cui fa riferimento il puntatore stringa. La funzione restituisce il puntatore stringa, se l'operazione di lettura ha successo, ovvero dopo aver copiato numero-1 caratteri, o dopo aver incontrato un carattere "nuova linea" o se durante la lettura incontra EOF. Essa restituisce NULL se si verifica un errore o se tenta di leggere oltre la fine del file. Utilizziamo tali modalità per leggere il contenuto di questo file: prova_di_lettura.txt prima riga seconda riga ora alcuni numeri interi 34 678 98323 ora alcuni decimali 23.2391 432.12323

/* inizio codice */ #include <stdio.h> #include <stdlib.h> int main() {int valore; char c; char lettura[100]; float f; FILE *input; /* questa è la variabile da utilizzare per la lettura di dati dal canale di comunicazione con il file. prima di iniziare la comunicazione con il documento su disco è necessario attivare il canale di comunicazione, specificando il nome del documento da leggere e la modalità di accesso al documento stesso */ input = fopen("prova_di_lettura.txt","r"); /* accediamo al dispositivo in lettura*/ if(input ==NULL) /* verifico che il canale sia attivo */ {printf("\n apertura fallita"); exit(0); /* leggiamo il testo del file, carattere per carattere, e visualizziamone il contenuto */ while(1) {c = fgetc(input); if(c==eof) break; /* interrompo il ciclo di lettura */ if(c<31) printf("%d",c); /* se è un carattere di controllo, ne visualizzo il codice ASCII */ else printf("%c",c); /* riavvolgiamo il file e utilizziamo la funzione fscanf() */ rewind(input); while(1) {valore = fscanf(input,"%s",lettura); if(valore == EOF) break; printf("%s",lettura); /* Notate che i caratteri "a capo" non sono stati inseriti nelle stringhe lette. Riavvolgiamo il file e utilizziamo la funzione fscanf() per leggere i numeri e la funzione fgets() per leggere le righe contenenti solo testo */ /* le prime tre righe sono formate da testo */ fgets(lettura,100,input); /* leggo la prima riga */ puts(lettura); fgets(lettura,100,input); /* leggo la seconda riga */ puts(lettura); fgets(lettura,100,input); /* leggo la terza riga */ puts(lettura); /* poi ci sono tre numeri interi */

fscanf(input,"%d",&valore); printf(" %d ",valore); fscanf(input,"%d",&valore); printf(" %d ",valore); fscanf(input,"%d",&valore); printf(" %d ",valore); /* poi una riga contenente solo testo */ fgets(lettura,100,input); puts(lettura); /* ed infine due decimali */ fscanf(input,"%f",& f); printf(" %f ",f); fscanf(input,"%f",& f); printf(" %f ",f); fclose(input); return 0; /* fine codice */ Oltre alla possibilità di gestire la comunicazione attraverso il canale in modalità testo, è possibile utilizzare la gestione in modalità binaria, ovvero mediante un flusso di Byte, sia in input che in output. In pratica, usando questa modalità, vengono lette dal disco o scritte su disco le sequenze di Byte che servono per rappresentare il valore di una data variabile. Tale flusso non subisce le interpretazioni cui può andare soggetto un flusso di dati gestito in modalità testo. Un vantaggio derivante dall'utilizzare la gestione binaria del flusso di dati è rappresentato dal risparmio di memoria che essa può comportare. consideriamo le seguenti variabili int a = 4000, b = 1234567890;

Entrambe sono variabili di tipo intero, quindi occupano 4 Byte in memoria; se copio tali byte su un file, entrambe occuperanno 4 Byte su disco. Se, viceversa, scrivo il valore delle variabili in modalità testo, la prima occuperà 4 Byte sul disco mentre la seconda ne occuperà 9. Come scriviamo / leggiamo Byte per Byte? int fwrite(void *puntatore,int dim,int num,file*output) La funzione invia al canale cui fa riferimento la variabile output la sequenza di Byte relativa ad un numero num di oggetti, ciascuno di dimensione pari a dim; tali byte sono vengono cercati a partire dalla locazione di memoria cui fa riferimento puntatore. Esempio: salviamo i valori di un array su disco. /* inizio codice */ #include <stdio.h> #include <stdlib.h> #define DIM 50 int main() {int *array; int i; FILE *output = fopen("testo.dat","w"); if(output == NULL) exit(0); FILE *bin_output = fopen("binario.dat","wb"); if(bin_output == NULL) exit(0); if((array = (int *) malloc( DIM * sizeof(int))) == NULL) exit(0); /* inizializzo gli elementi */ array[i] = rand() ; /* scrivo i valori in modalità testo usando il canale di testo */ fprintf(output," %d \n",array[i]); fclose(output); /* chiudo il canale di testo */ /* scrivo i valori in modalità binaria, uno dopo l'altro */

fwrite(array+i,sizeof(int),1,bin_output); /* scrivo i valori in modalità binaria, tutti in una sola volta */ fwrite(array,sizeof(int),dim,bin_output); /* scrivo l'intero array, in un colpo solo */ fwrite(array,dim*sizeof(int),1,bin_output); fclose(bin_output); return 0; /* fine codice */ Ora nel file binario ci sono tre copie del medesimo array. Leggiamo tali valori in modalità binaria usando la funzione fread(). Se tentiamo di leggere il file binario.dat usando un editor di testo vediamo qualcosa che non ha nulla a che fare con i valori salvati nel file testo.dat int fread(void *puntatore,int dim,int num,file*input) La funzione legge dal canale cui fa riferimento la variabile input la sequenza di Byte relativa ad un insieme di al più num oggetti, ciascuno di dimensione pari a dim; tali byte sono vengono cercati a partire dalla locazione di memoria cui fa riferimento puntatore. /* inizio codice */ #include <stdio.h> #include <stdlib.h> #define DIM 50 int main() {int *array; int i; FILE *bin_input = fopen("binario.dat","rb"); if(bin_input == NULL) exit(0); /* riservo l'area di memoria in cui scrivere i valori che verranno letti in seguito */ if((array = (int *) malloc( DIM * sizeof(int))) == NULL) exit(0); /* leggo i valori, tutti in una volta */

fread(array,sizeof(int)*dim,1,bin_input); /* visualizzo i valori */ fprintf(stdout," %d \n",array[i]); /* ora li leggo uno dopo l'altro */ fread(array+i,sizeof(int),1,bin_input); fprintf(stdout," %d \n",array[i]); fclose(bin_input); return 0; /* fine codice */