/* File: listerw.c */ /* Time-stamp: "2002-05-20 18:50:19 calvanes" */ /* Scopo: funzioni di lettura di liste e scrittura di liste su file */ /* Richiede le seguenti definizioni preliminari: typedef TipoElemLista ...; struct nodoLista { TipoElemLista info; struct nodoLista *next; }; typedef struct nodoLista NodoLista; typedef NodoLista *TipoLista; void StampaElemento(FILE *fi, TipoElemLista elem) { ... } int LeggiElemento(FILE *fi, TipoElemLista *pelem) { ... } */ void LeggiLista(char *nomefile, TipoLista *plis) /* Restituisce in *plis una lista i cui elementi vengono letti dal file di nome nomefile. Chiama LeggiElemento per la lettura di un elemento. La lettura termina quando LeggiElemento restituisce EOF. L'ordine degli elementi nella lista e` lo stesso che nel file. */ { TipoLista aux; TipoElemLista elem; FILE *datafile; datafile = fopen(nomefile, "r"); if (datafile == NULL) { /* errore in apertura in lettura */ fprintf(stderr, "Errore aprendo il file `%s' in lettura\n", nomefile); *plis = NULL; } else { *plis = malloc(sizeof(NodoLista)); /* creazione del record generatore */ aux = *plis; /* lettura della lista */ while (LeggiElemento(datafile, &elem) != EOF) { /* allocazione di una struttura e lettura del nuovo elemento */ aux->next = malloc(sizeof(NodoLista)); aux = aux->next; aux->info = elem; } aux->next = NULL; /* chiusura della lista */ /* cancellazione del record generatore */ aux = *plis; *plis = (*plis)->next; free(aux); fclose(datafile); } /* else */ } /* LeggiLista */ void ScriviLista(char *nomefile, TipoLista lis) /* Scrive gli elementi della lista lis sul file di nome nomefile. Chiama ScriviElemento per la scrittura di un elemento. */ { FILE *datafile; datafile = fopen(nomefile, "w"); if (datafile == NULL) /* errore in apertura */ fprintf(stderr, "Errore aprendo il file `%s' in scrittura\n", nomefile); else { while (lis != NULL) { ScriviElemento(datafile, lis->info); lis = lis->next; } fclose(datafile); } } /* ScriviLista */ void LeggiListaFile(FILE *datafile, TipoLista *plis) /* Restituisce in *plis una lista i cui elementi vengono letti dal file datafile, che si suppone gia` aperto in lettura. Chiama LeggiElemento per la lettura di un elemento. La lettura termina quando LeggiElemento restituisce EOF. L'ordine degli elementi nella lista e` lo stesso che nel file. */ { TipoLista aux; TipoElemLista elem; *lis = malloc(sizeof(NodoLista)); /* creazione del record generatore */ aux = *plis; /* lettura della lista */ while (LeggiElemento(datafile, &elem) != EOF) { /* allocazione di una struttura e lettura del nuovo elemento */ aux->next = malloc(sizeof(NodoLista)); aux = aux->next; aux->info = elem; } aux->next = NULL; /* chiusura della lista */ /* cancellazione del record generatore */ aux = *plis; *plis = (*plis)->next; free(aux); } /* LeggiListaFile */ void ScriviListaFile(FILE *datafile, TipoLista lis) /* Scrive gli elementi della lista lis sul file datafile, che si suppone gia` aperto in scrittura. Chiama ScriviElemento per la scrittura di un elemento. */ { while (lis != NULL) { ScriviElemento(datafile, lis->info); lis = lis->next; } } /* ScriviListaFile */