INTRODUZIONE ALLA PROGRAMMAZIONE IN C



I/O di basso livello



Tale forma di I/O e' UNBUFFERED, cioe' ogni richiesta di read/write comporta un accesso diretto al disco (o device) scrivendo o leggendo uno specificato numero di bytes. Non ci sono facilitazioni di formato, poiche' a questo livello si lavora con i bytes di informazione; questo significa che ora si usano binary (e non text) files. Invece di un puntatore a file si usa un trattamento del file di basso livello, detto anche "descrittore del file" che da' un unico numero intero per identificare ciascun file. Per aprire un file si usa: int open(char *filename, int flag, int perms) che ritorna un file descriptor, oppure -1 se l'operazione fallisce. Il flag controlla l'accesso al file ed ha i seguenti predefiniti valori definiti nel file fcntl.h: O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_WRONLY ecc. "perms" viene settato ottimamente a 0 per la maggior parte delle applicazioni. Per creare un file si puo' usare la funzione: creat(char *filename, int perms) Per chiudere un file si usa: int close(int handle) Per leggere/scrivere uno specificato numero di bytes da/su un file immagazzinati in una locazione di memoria specificata da "buffer" si utilizzano: int read(int handle, char *buffer, unsigned length) int write(int handle, char *buffer, unsigned length) Queste due funzioni ritornano il numero di byte letti/scritti o -1 se falliscono. Per specificare la lunghezza si utilizza, in genere, la funzione sizeof(). Ad esempio: /* legge un elenco di float da un file binario il primo byte del file dice quanti float ci sono nel file. Successivamente vengono elencati i float; il nome del file e' letto dalla linea di comandi */ #include <stdio.h> #include <fcntl.h> float bigbuff[1000]; main(int argc,char **argv) { int fd; int bytes_read; int file_length; if((fd=open(argv[1],O_RDONLY))==-1) { /* errore, file non aperto */ exit(1); } if ((bytes_read=read(fd,&file_length,sizeof(int))==-1) { /* errore in lettura file */ exit(1); } if (file_length>999) { /* file troppo grande */ exit(1); } if((bytes_read=read(fd,bigbuff, file_length*sizeof(float)))==-1) { /* errore in lettura file aperto */ exit(1); } }