/* File: listeirw.c */ /* Time-stamp: "2002-05-20 18:57:37 calvanes" */ /* Scopo: funzioni di lettura e scrittura di liste di interi da file */ /* Richiede le seguenti definizioni preliminari: struct nodoLista { int info; struct nodoLista *next; }; typedef struct nodoLista NodoLista; typedef NodoLista *TipoLista; */ void LeggiLista(char *nomefile, TipoLista *plis) /* Restituisce in *plis una lista i cui elementi vengono letti dal file di nome nomefile. L'ordine degli elementi nella lista e` lo stesso che nel file. */ { TipoLista aux; int 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; while (fscanf(datafile, "%d", &elem) == 1) { /* 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) { fprintf(datafile, "%d ", 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; *plis = malloc(sizeof(NodoLista)); /* creazione del record generatore */ aux = *plis; while (fscanf(datafile, "%d", &elem) == 1) { /* 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) { fprintf(datafile, "%d ", lis->info); lis = lis->next; } } /* ScriviListaFile */