/* Scrittura e lettura di file binari mediante system call (open, write, read e close) */ #include #include #include #include /* Per utilizzare le system call write, read e close */ #include /* Per system call open */ #include /* Per system call open */ #include /* Per system call open */ #define LUN 50 #define N_STUD 2 typedef struct stud{ char nome[LUN+1]; unsigned int matricola; float media; }stud_t; int main() { int fd; /* NOTA: il fd e' un intero, non FILE* */ stud_t studente[N_STUD]; int i; char riga[LUN+1]; unsigned int n_stud; strcpy(studente[0].nome, "Stefano"); studente[0].matricola = 120000; studente[0].media = 25.5; strcpy(studente[1].nome, "Giulia"); studente[1].matricola = 120001; studente[1].media = 28.5; /* Quando nella funzione open viene specificato come secondo argomento: O_CREAT : che significa crea il file se non esiste bisogna aggiungere un terzo argomento (inutile per le altre opzioni) che specifica con che permessi deve essere creato un eventuale nuovo file: S_IRUSR 400 Permesso di Lettura per owner S_IWUSR 200 Permesso di Scrittura per owner S_IRGRP 040 Permesso di Lettura per gruppo S_IROTH 004 Permesso di Lettura per altri utenti in definitiva il file viene creato con i permessi 644, cioe' -rw-r--r-- */ fd = open("out.bin", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); /* Apertura file in scrittura */ if (fd == -1) { /* In caso di error open restituisce -1 ! */ printf("Errore: impossibile aprire il file out.bin\n"); exit(1); } /* Scrittura del file */ /* NOTA 2: un file binario non e' detto che sia sempre leggibile in modo corretto su una calcolatore differente da quello su cui e' stato generato, perche' ad esempio i numeri interi potrebbero essere codificati su un numero diverso di byte */ /* Scrittura in binario di tutti i record */ write(fd, studente, N_STUD*sizeof(stud_t)); /* DIMENSIONE DEL FILE GENERATO La dimensione del file generato sara': n_stud*sizeof(stud_t) nel caso del calcolatore su cui e' stato testato il programma: 2*60 = 120 byte */ close(fd); /* Chiusura del file */ fd = open("out.bin", O_RDONLY); /* Apertura file in lettura */ if (fd == -1){ printf("Errore: impossibile aprire il file out.bin\n"); exit(1); } /* Lettura del file */ n_stud = 0; while( read(fd, &studente[n_stud], sizeof(stud_t)) == sizeof(stud_t) ) { n_stud++; } close(fd); /* Chiusura del file */ /* Stampa dei record letti */ for (i=0; i