/* File: listeirw.c */ /* Time-stamp: "2001-05-09 15:40:55 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 *lis) /* Restituisce in lis 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 paux; 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); *lis = NULL; } else { *lis = malloc(sizeof(NodoLista)); /* creazione del record generatore */ paux = *lis; fscanf(datafile, "%d", &elem); while (!feof(datafile)) { /* allocazione di una struttura e lettura del nuovo elemento */ paux->next = malloc(sizeof(NodoLista)); paux = paux->next; paux->info = elem; fscanf(datafile, "%d", &elem); } paux->next = NULL; /* chiusura della lista */ /* cancellazione del record generatore */ paux = *lis; *lis = (*lis)->next; free(paux); 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 *lis) /* Restituisce in lis 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 paux; TipoElemLista elem; *lis = malloc(sizeof(NodoLista)); /* creazione del record generatore */ paux = *lis; fscanf(datafile, "%d", &elem); while (!feof(datafile)) { /* allocazione di una struttura e lettura del nuovo elemento */ paux->next = malloc(sizeof(NodoLista)); paux = paux->next; paux->info = elem; fscanf(datafile, "%d", &elem); } paux->next = NULL; /* chiusura della lista */ /* cancellazione del record generatore */ paux = *lis; *lis = (*lis)->next; free(paux); } /* 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 */