Manuale libreria file

H_file: gestione dei file con organizzazione hash

Struttura dati

#define FREE 0
#define NIL -1
#define OK 0
#define ERR -1
#define TROVATO -2
typedef struct {
long sfile; /*Dimensione file in numero record */
long srec; /* Dimensione record in byte; */
long skey; /* Dimensione chiave in byte; */
long pll; /* Radice lista record liberi; */
} informazioni;
typedef struct {
int fd;/* Identificatore file */
char * path;/* Nome file */
informazioni info;
} H_file;

Primitive

int H_creat (char* path, long recsize, long filesize, long keysize);

Crea un file di nome path e lo inizializza opportunamente. Le informazioni relative alla struttura vengono inserite nei primi bytes. Se il file esiste allora errore. Restituisce -1 per errore, 0 altrimenti.

H_file* H_open (char* path);

Apre un file esistente, legge i primi bytes con i quali si inizializza la struttura dati H_file; ha in input il nome del file e restituisce il puntatore alla struttura dati in cui sono memorizzate le informazioni necessarrie alla gestione del file stesso. Restituisce 0 in caso di errore.

int H_write (H_file* hf, char* record);

Scrive un record nel file alla giusta posizione; ha in input il puntatore al descrittore del file da utilizzare e il record da inserire nel file. Restituisce -1 per errore, 0 se l'operazione ha successo.

int H_read (H_file* hf, char* record);

Legge un record dal file hash; ha in input il puntatore al descrittore del file da utilizzare e l'indirizzo del record dove inserire i dati letti. Nel record deve essere preventivamente inserita la chiave. Restituisce -1 per errore, 0 se l'operazione ha successo.

int H_delete (H_file* hf, char* record);

Cancella un record dal file hash; ha in input il puntatore al descrittore del file da utilizzare e l'indirizzo del record dove deve essere preventivamente inserita la chiave. Restituisce -1 per errore, 0 se l'operazione ha successo.

int H_close (H_file* hf);

Chiude il file, liberando la memoria associata; ha in input il puntatore al descrittore del file da utilizzare. Restituisce -1 per errore, 0 se l'operazione ha successo.

D_file: gestione dei file ad accesso diretto.

struttura dati

#define BUFSIZE 1024
struct recdes {
int recsize; /* Dimensione del record in byte */
long next; /* Posizione del record corrente */
long last; /* Posizione dell'ultimo record */
}
struct bufdes {
char copia; /* Indica se ci sono state modifiche nel buffer */
;long pfile; /* Indirizzo fisico di partenza del primo record del file */
int nbb; /* Numero di byte effettivamente utilizzate del buffer */
}
typedef struct {
char* path; /* Nome del file */
int fd; /* File descriptor */
struct bufdes bd;
struct recdes rd;
char buffer[BUFSIZE]; /* Buffer di i/o */
}

Primitive

D_file* D_open (char* path, int recsize);

Apre un file ad accesso diretto predisponendo le strutture in memoria; ha in input il nome del file e la dimensione del record, restituisce il puntatore alla struttura dati D_file; se fallisce restituisce 0.

int D_read (D_file* df, char* record);

Legge un record; ha in input il puntatore al descrittore del file da utilizzare e l'indirizzo del record dove inserire i dati letti; il record letto è specificato dal campo next. Restituisce -1 (record inesistente) in caso di errore, 0 altrimenti.

int D_write (D_file* df, char* record);

Scrive un record; ha in input il puntatore al descrittore del file da utilizzare e l'indirizzo del record dove vi sono i dati da scrivere sul file; i dati vengono scritti nella posizione corrente. Restituisce -1 in caso di errore, 0 altrimenti.

int D_seek (D_file* df, long position);

Modifica il contenuto della posizione corrente, settandola a position. ha in input il puntatore al descrittore del file da utilizzare e la nuova posizione corrente. Restituisce -1 in caso di errore, 0 altrimenti.

int D_lastpos (D_file* df)

Restituisce la posizione dell'ultimo record del file; ha in input il puntatore al descrittore del file da utilizzare. Restituisce -1 in caso di errore.

int D_current (D_file* df);

Restituisce la posizione del record corrente del file; ha in input il puntatore al descrittore del file da utilizzare. Restituisce -1 in caso di errore.

int D_close (D_file* df);

Chiude il file; ha in input il puntatore al descrittore del file da utilizzare. Restituisce -1 per errore, 0 altrimenti

I_file: gestione dei file ad accesso index

#define PAGESIZE 2048
#define OFFSET 8
typedef struct {

int recsize, /* dimensione record in bytes */
i_key, /* byte di inizio chiave */
l_key; /* lunghezza chiave in bytes */
} rec_des;
typedef struct {
long n_next, /* numero fisico della pagina successiva (indirizzo) */
nrb, /* numero record buoni(occupati) */
n_fis, /* numero fisico della pagina (indirizzo) */
nrc; /* numero record corrente */
} page_des;
typedef struct {
int fd; /* descrittore file */
char * path; /* percorso */
rec_des rd; /* caratteristiche del record */
page_des pd; /* caratteristiche della pagina*/
long pb, /* numero fisico (indirizzo) della prima Pagina Buona (occupata) */
pl; /* ;numero fisico (indirizzo) della prima Pagina Libera (vuota) */
char copia; /* 1 deve copiare,0 no */
char buffer[PAGESIZE-OFFSET];
} desc;
typedef struct {
int n; /* numero dei livelli ( liv. 0 = DATI liv. 1...n = KEY ) */
desc * main; /* vettore di files */
} I_file;

Primitive

int I_creat( char* name, int n_livel, int recsize, int i_key, int l_key )

crea il file con organizzazione index; n_livel= numero livelli di chiave;

recsize = dimensione record;

i_key = posizione della chiave nel record( 0 per p. p.)

l_key= lunghezza chiave;

La chiave può essere composta da più campi.

I_file* I_open( char* name )

Apre il file name predisponendo tutte le strutture dati necessarie per l'utilizzo.

int I_delete( I_file* f , char* key )

Cancella il record di chiave key; restituisce 0 per successo, -1 se non trovato

int I_read( I_file* f, char* r )

Legge un record con chiave; r indica il record che deve contenere la chiave di ricerca; i dati sono inseriti in r; restituisce 0 per trovato, -1 per non trovato; in questo ultimo caso il puntatore è posizionato sul primo record successivo in base all'ordinamento alfabetico.

int I_readnext( I_file* f, char* r )

legge il prossimo record inserendo i dati in r; restituisce 0 per trovato, -1 per errore.

int I_write( I_file* f, char* rec )

scrive un record nel file; restituisce sempre 0; se il record non esiste viene inserito, se esiste vengono modificati i dati.

int I_close(I_file* If)

chiude il file; restituisce sempre 0;