Oddio,
lesame si avvicina (Lunedi)...il programma è una mailing list, inserisce gli utenti in un array di strutture che contengono i campi relativi ai vari utenti, si possono aggiungere, eliminare, visualizzare, salvare su file e leggere da file...compila ma dopo che effettuo l'inserimento degli utenti e gli dico di visualizzarli non me li visualizza correttamente come se non li avesse inseriti bene...sono disperato...cos'è che non funziona?!? è grave
codice:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 100
struct addr{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
}addr_list[MAX]; // Dichiara un vettore di MAX locazioni di tipo struct addr
void init_list(void); // Inizializza l'array di strutture, non riceve alcun paramentro, non ritorna nulla
void enter(void);
void delete(void);
void list(void);
void load(void);
void save(void);
int menu_select(void);
int find_free(void);
int main(){
char choice;
init_list(); // Inizializza l'array di strutture
for(;;){
choice = menu_select(); // metti in choice la scelta effettuata: valore ritornato da menu_select()
switch(choice){
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: save();
break;
case 5: load();
break;
case 6: exit(0);
}
}
return 0;
}
/* La funzione init_list() inizializza l'array di strutture, non riceve alcun parametro e non restituisce nulla */
void init_list(void){
register int t;
for(t=0; t<MAX; ++t)
addr_list[t].name[0] = '0'; // Se il primo carattere del nome è \0 la locazione è vuota
}
/* La funzione menu_select() legge la scelta dell'utente, non riceve alcun parametro, restituisce un intero */
int menu_select(void){
char s[80];
int c;
printf("1: Inserire un nuovo utente\n");
printf("2: Cancellare un untente\n");
printf("3: Elenca gli utenti\n");
printf("4: Salva il file\n");
printf("5: Carica il file\n");
printf("6: Termina il programma\n");
do{
printf("Scegliere un'opzione valida: ");
gets(s); // Metti l'opzione scelta nella stringa s
c = atoi(s); // Trasforma la stringa in un valore intero accettabile e lo mette in c
}while(c<1 || c>6); // Continua a chiedere di inserire una scelta finchè questa non è valida
return c; // Ritorna al main la scelta effettuata
}
/* La funzione enter() inserisce i nomi nell'array di strutture, non riceve alcun parametro, non restituisce nulla */
void enter(void){
int slot;
char s[80];
slot = find_free(); // Metti dentro a slot il valore resituito da find_free(): prima locazione libera
if(slot == -1){ // Se find_free() restituisce -1 l'array di strutture è completo
printf("Elenco completo");
return; // Non inserisce nulla e ritona al chiamante
}
printf("Inserire il nome: ");
gets(addr_list[slot].name);
printf("Inserire la via: ");
gets(addr_list[slot].street);
printf("Inserire la città: ");
gets(addr_list[slot].city);
printf("Inserire la provincia: ");
gets(addr_list[slot].state);
printf("Inserire il CAP: ");
gets(s);
addr_list[slot].zip = strtoul(s, '\0', 10);
}
/* La funzione find_free() trova una struttura inutilizzata, non riceve alcun parametro e restituisce al chiamante
-1 se non ci sono più locazioni vuote all'interno dell'array o la prima locazione libera nell'array */
int find_free(void){
register int t;
/* Incrementa t finchè il primo carattere del campo name delle varie strutture dell'array contiene un
valore (struttura non libera) e finchè t è minore di MAX (array pieno) */
for(t=0; addr_list[t].name[0] && t<MAX; ++t)
if(t == MAX) return -1; // Se l'array è pieno torna il valore -1 al chiamante
return t; // Se l'array non è completo ritorna al chiamante la prima locazione libera
}
/* La funzione delete() cancella un elemento dalla lista, non riceve alcun parametro e non restituisce nulla */
void delete(void){
register int slot;
char s[80];
printf("Inserire il numero del record da eliminare: ");
gets(s);
slot = atoi(s); // Trasforma la stringa in s in un valore intero accettabile e lo mette in slot
if(slot>=0 || slot<MAX) // Se il valore di slot è valido (se appartiene ad una delle locazioni della lista)
addr_list[slot].name[0] = '\0'; // Rendi '\0' il primo carattere del campo name della struttura
}
/* La funzione list() visualizza l'elenco dei nominativi nella lista, non riceve alcun paramentro e non restituisce
nulla */
void list(void){
register int t;
for(t=0; t<MAX; ++t){
/* Se il primo carattere del campo name della struttura corrente nell'array è diverso da '\0' */
if(addr_list[t].name[0]){
printf("%s\n", addr_list[t].name);
printf("%s\n", addr_list[t].street);
printf("%s\n", addr_list[t].city);
printf("%s\n", addr_list[t].state);
printf("%lu\n\n", addr_list[t].zip);
}
}
printf("\n\n");
}
/* La funzione save() salva l'elenco degli utenti inseriti nella lista su un file, non riceve alcun parametro e non
restituisce nulla al chiamante */
void save(void){
FILE *fp; // Dichiaro un puntatore a file
register int i;
/* Prova ad aprire un file binario in modalità scrittura ed assegna il puntatore a tale file a fp, se non
riesce ad aprire il file allora avverti l'utente e torna al chiamante senza fare nulla */
if((fp=fopen("maillist", "wb")) == NULL){
printf("Impossibile aprire il file\n");
return; // Torna al chiamante senza fare nulla
}
for(i=0; i<MAX; i++)
if(*addr_list[i].name) //Se il primo carattere del campo name della struttura corrente diverso da '\0'
if(fwrite(&addr_list[i], sizeof(struct addr), 1,fp) !=1) // Se non può scrivere sul file
printf("Errore di scrittura dul file\n");
fclose(fp); // Chiudi il file
}
/* La funzione load() carica una mailing list precedentemente salvata su file, non riceve alcun parametro e non
restituisce nulla al chiamante */
void load(void){
FILE *fp; // Dichiaro un puntatore a file
register int i;
/* Prova ad aprire il file binario in modalità di lettura, se al puntatore fp viene assegnato il valore
NULL fopen() non è riuscita ad aprire il file e viene dato un messaggio di errore e si torna al
chiamante senza aver fatto nulla */
if((fp=fopen("maillist", "rb")) == NULL){
printf("Impossibile aprire il file\n");
return; // Torna al chiamante
}
init_list(); // Altrimenti inizializza il nuovo array di strutture
for(i=0; i<MAX; i++) // e carica i valori salvati sul file nella nuova lista inizializzata
if(fread(&addr_list[i], sizeof(struct addr), 1, fp) != 1){
if(feof(fp))
break;
printf("Errore di lettura dal file\n");
}
fclose(fp);
}
Grazie