User Tools

Site Tools


it:informatica:linux:scrittura_e_lettura_file_binario_system_call_read_e_write
Return to Home page

Scrittura e lettura file binario (system call read e write)

Concetti:

System call per l'apertura, chiusura, scrittura e lettura di un file (open, close, write e read).

Testo:
Dopo aver riempito un vettore di strutture (i cui elementi della struttura sono un vettore di caratteri contenente il nome di uno studente, una variabile di tipo unsigned int contenente la matricola dello studente ed una variabile di tipo float contenente la sua media):

  • Aprire in scrittura un file di nome “out.bin” per salvarci i dati contenuti nel vettore di strutture
  • Scrivere nel file in modo binario, utilizzando la system call write, il contenuto del vettore di strutture precedentemente riempito
  • Chiudere il file
  • Riaprire il file in lettura
  • Leggerlo utilizzando la system call read e riempire con i dati ottenuti il vettore di strutture precedentemente creato
  • Stampare tutti i dati contenuti nel vettore di strutture
  • Chiudere il file

Soluzione:

file_binario_write_read.c
/* Scrittura e lettura di file binari mediante system call
   (open, write, read e close) */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /* Per utilizzare le system call
                       write, read e close */
 
#include <sys/types.h> /* Per system call open */
#include <sys/stat.h>  /* Per system call open */
#include <fcntl.h>     /* 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<n_stud; i++) {
    printf("%s %d %f\n", studente[i].nome, studente[i].matricola, studente[i].media);
  }
 
 
  return 0;
}

If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it

You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/it/informatica/linux/scrittura_e_lettura_file_binario_system_call_read_e_write
/web/htdocs/www.skenz.it/home/data/pages/it/informatica/linux/scrittura_e_lettura_file_binario_system_call_read_e_write.txt · Last modified: 2019/02/26 14:35 (external edit)

Privacy Policy