PDA

Visualizza la versione completa : [c]carica stringhe da file e salva su lista


volcom
25-07-2012, 12:32
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAX 50

struct cliente
{
char nome[20];
char cognome[20];
int codice;
struct cliente *next;
};

struct prenotazione
{
int codicecliente;
int stanza;
int giornoarrivo;
int giornopartenza;
int mesearrivo;
int mesepartenza;
}lista[100];

struct data
{
int arrivo;
int partenza;
}calend[100];

int calendario[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

int numero;
struct cliente *crea();
struct cliente *inserisci(struct cliente *);
void cerca(struct cliente *);
void visualizza(struct cliente *);
void menuprenotazione(struct cliente *);
void menu(struct cliente *);
void elenca();
int gestionedata (int giornoa,int mesea,int giornop,int mesep);
int controllo(int giornoarrivo,int giornopartenza);
void salvalista(struct cliente *);
struct cliente *caricalistaprimo();
struct cliente *caricalistanext(struct cliente *);

int i=1;
int j=0;
main()
{
int c=-1;
struct cliente *p, *new;
while(c!=0)
{
printf("\nNella lista sono presenti %d clienti",i-1);
printf("\nE [%d] prenotazioni",j);
printf("\n\n\t1.crea nuovo cliente");
printf("\n\t2.cerca clienti");
printf("\n\t3.visualizza lista clienti");
printf("\n\t4.crea prenotazione");
printf("\n\t5.elenca lista prenotazioni");
printf("\n\t6.Salva lista cliente sul file di testo [listaclienti.txt]");
printf("\n\t7.Carica lista clienti da file [listaclienti.txt]");
printf("\n\nDigita la scelta ---->");
scanf("%d",&c);
switch(c)
{
case 1:
if (i==1)
{
p = crea();
i++;
new = p;
break;
}
else
{
new->next=malloc(sizeof(struct cliente));
new = inserisci(new->next);
break;
}
case 2: cerca(p); break;
case 3: visualizza(p); break;
case 4: menuprenotazione(p); break;
case 5: elenca(); break;
case 6: salvalista(p); break;
case 7:
if (i==1)
{
p = caricalistaprimo();
i++;
new = p;

}
else
{
new->next=malloc(sizeof(struct cliente));
new = caricalistanext(new->next);
break;
}

}
}
}

struct cliente * crea(){

struct cliente *p;

p = malloc(sizeof(struct cliente));

printf("\nInserisci nome del cliente ");
scanf("%s", p->nome);
printf("\nInserisci cognome ");
scanf("%s", p->cognome);
p->codice = 1;
printf("\nAl cliente è stato assegnato il codice [1]\n");
p->next=NULL;
return p;
}

struct cliente * inserisci(struct cliente *p){


printf("\nInserisci nome del cliente ");
scanf("%s", p->nome);
printf("\nInserisci cognome ");
scanf("%s", p->cognome);
p->codice = i;
printf("\nAl cliente è stato assegnato il codice [%d]\n",i);
i++;
p->next= NULL;

return p;
}

void cerca(struct cliente *p)
{
int codice;
printf("\ndigita il codice cliente---->");
scanf("%d", &codice);


do
{
if (p->codice==codice)
{
printf("\n\nil codice cliente appartiene a [ %s %s ]",p->nome,p->cognome);
}

}
while ((p = p->next) !=NULL);

}

void visualizza(struct cliente *p)
{
int d=1;
printf("[codice] [nome] [cognome]");
while (p!=NULL)
{
printf("\n [%d] %s %s\n",d,p->nome,p->cognome);
d++;
p = p->next;
}
}
void menuprenotazione(struct cliente *p)
{
int sel;

printf("\nIl cliente che vuole prenotare e' gia' nella lista clienti?");
printf("\n1.si");
printf("\n2.no\nscelta---> ");
scanf("\n%d",&sel);

switch(sel)
{
case 1: menu(p); break;
case 2: printf("\nBisogna immettere i dati del cliente prima"); break;
default : printf("\nscelta non valida"); break;
}
}

void menu(struct cliente *p)
{
int state=0;
int giornoa;
int mesea;
int giornop;
int mesep;
int sel;
printf("\nImmettere codice cliente ->");
scanf("%d",&sel);
while (p!=NULL)
{
if (p->codice==sel)
{
printf("\nImmettere dati di arrivo per cliente [%s %s codice(%d)]",p->nome,p->cognome,p->codice);
do{
printf("\nImmettere mese di arrivo ");
scanf("%d",&mesea);
if(mesea>12)
do
{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&mesea);
}
while(!(mesea<=12));
printf("\nImmettere giorno di arrivo ");
scanf("%d",&giornoa);
if(mesea==11||mesea==4||mesea==6||mesea==9)
if(giornoa>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornoa);
}
while(!(giornoa<=30)||(giornoa>=31));
if(mesea==2)
if(giornoa>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornoa);
}
while(!(giornoa<=29));
printf("\nImmettere mese di partenza ");
scanf("%d",&mesep);
if((mesep>12)||(mesep<mesea))
do
{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&mesep);
}
while(!((mesep<=12)&&(mesep>=mesea)));
printf("\nImmettere giorno di partenza ");
scanf("%d",&giornop);
if(mesep==11||mesep==4||mesep==6||mesep==9)
if(giornop>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornop);
}
while(!(giornop<=30)||(giornop>=31));
if(mesep==2)
if(giornop>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornop);
}
while(!(giornop<=29));

state=gestionedata(giornoa,mesea,giornop,mesep);

lista[j].codicecliente=p->codice;

}while(state==1);
}

p = p->next;
}
lista[j].giornoarrivo=giornoa;
lista[j].mesearrivo=mesea;
lista[j].giornopartenza=giornop;
lista[j].mesepartenza=mesep;
j++;
}

void elenca()
{
int t;
for(t=0;t<j;t++)
{
printf("\nPer il cliente con codice [%d]",lista[t].codicecliente);
printf("\ngiorno arrivo [%d] mese [%d]\n",lista[t].giornoarrivo,lista[t].mesearrivo);
printf("\ngiorno partenza [%d] mese [%d]\n\n\n",lista[t].giornopartenza,lista[t].mesepartenza);
}
}

int gestionedata(int giornoa,int mesea,int giornop,int mesep)
{
int sta=0;
int t;
int giornoarrivo=giornoa;
int giornopartenza=giornop;
for (t=0;t<mesea;t++)
{
giornoarrivo=giornoarrivo+calendario[t];
}
calend[j].arrivo=giornoarrivo;
for (t=0;t<mesep;t++)
{
giornopartenza=giornopartenza+calendario[t];
}
calend[j].partenza=giornopartenza;
if (j>0)
{
sta=controllo(giornoarrivo,giornopartenza);
return sta;
}
}


int controllo(int giornoarrivo,int giornopartenza)
{
int t;
for (t=0;t<j;t++)
{
if ((giornoarrivo>=calend[t].arrivo)&&(giornoarrivo<=calend[t].partenza)||(giornopartenza>=calend[t].arrivo)&&(giornopartenza<=calend[t].partenza))
{
printf("\nData non disponibile visualizzare l'elenco prenotazione e scegliere una prenotazione valida");
elenca();
return 1;
}
else
{
return 0;
}
}
}
void salvalista(struct cliente *p)
{
FILE *fp;

fp=fopen("listaclienti.txt","a+");


while (p!=NULL)
{
fprintf(fp,"%d %s %s\n",p->codice,p->nome,p->cognome);
p = p->next;
}
fclose(fp);
}

struct cliente * caricalistaprimo()
{


FILE *fp;

fp=fopen("listaclienti.txt","a+");


struct cliente *p;

p = malloc(sizeof(struct cliente));

fscanf(fp,"%d %s %s",&p->codice,p->nome,p->cognome);
p->next=NULL;
return p;
fclose(fp);
}

struct cliente *caricalistanext(struct cliente *p)
{

FILE *fp;

fp = fopen("listaclienti.txt","a+");
char c[100];
fgets(c,100,fp);

while(!feof(fp))
{
while(p!=NULL)
{
fscanf(fp,"%d %s %s\n",&p->codice,p->nome,p->cognome);
p = p->next;
i++;
}

}
return p;
fclose(fp);
}


Scusate ancora ragazzi, ho un problema non riesco a capire perchè le ultime 2 funzioni non riescono a caricare delle stringhe contenute in un file per poi salvarle in una lista, avete qualche suggerimento?

lasciando stare tutto il resto del codice, come faccio a salvare delle stringhe in un file in una lista? cioè salvo il primo elemento e non riesco a salvare i successivi.

oregon
25-07-2012, 13:23
Ma perché due funzioni (primo e next) e non una sola?

Perché la fclose dopo la return?

volcom
25-07-2012, 13:30
è questo il fatto, stavo cercando di spezzettare il problema in piu' funzioni dato che non riesco a venirne a capo, in questo caso stavo provando nello stesso modo che ho usato per creare gli elementi della lista da tastiera, ma è sbagliato.
Non capisco come andare avanti cioè, leggo il primo elemento della lista e lo memorizo poi dovrei scorrere il file saltando la prima riga, allocando di volta in volta la memoria e memorizzo, ma c'è qualcosa che non riesco a capire o vedere.

oregon
25-07-2012, 13:39
Ma no ... devi fare una sola funzione sola che apre il file, legge tutti gli elementi e lo chiude.

volcom
25-07-2012, 13:51
si ho capito ma la lista quando apro il file ancora non è creata, quindi dovrei creare il primo elemento e poi allocare di volta in volta.

riusciresti a farmi un esempio con un file con delle stringhe che devono essere memorizzate in una lista ancora vuota? scusa il disturbo

oregon
25-07-2012, 14:02
Prima di farti un esempio, perché non ci provi da solo? Sarebbe più formativo ...

Passa un puntatore al puntatore al primo elemento della tua lista posto a NULL alla funzione e crea elemento dopo elemento nella funzione ...

struct cliente *plist = NULL;

funzionechelegge(&plist)

...

volcom
25-07-2012, 14:59
oregon ti ringrazio tantissimo, ma non ci riesco, sono ancora alle prime armi con le liste dinamiche, probabilmente mi prenderai per un idiota ma è da stamattina che ci sbatto le corna senza risultato, sono entrato nel pallone completamente.

oregon
25-07-2012, 16:08
http://www.dis.uniroma1.it/~liberato/struct/liste/lineare.shtml

volcom
25-07-2012, 16:55
Non riesco, mi da errore di segmentazione, forse è la funzione feof, domani devo consegnare questo elaborato e sono ad un punto morto, ho visto molti esempi sulla rete ma il problema non è la teoria perchè ho studiato molto, so cosa si deve fare ma non riesco a farlo :( :(

volcom
25-07-2012, 18:45
#include <stdio.h>
#include <string.h>
#include <malloc.h>


struct cliente
{
char nome[20];
char cognome[20];
int codice;
struct cliente *next;
};

struct prenotazione
{
int codicecliente;
int stanza;
int giornoarrivo;
int giornopartenza;
int mesearrivo;
int mesepartenza;
}lista[100];

struct data
{
int arrivo;
int partenza;
}calend[100];

int calendario[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

int numero;
struct cliente *crea();
struct cliente *inserisci(struct cliente *);
void cerca(struct cliente *);
void visualizza(struct cliente *);
void menuprenotazione(struct cliente *);
void menu(struct cliente *);
void elenca();
int gestionedata (int giornoa,int mesea,int giornop,int mesep);
int controllo(int giornoarrivo,int giornopartenza);
struct cliente *creanext(struct cliente *);
struct cliente *creaprimo();
void salvalista(struct cliente *);
int i=1;
int j=0;
main()
{
int c=-1;
struct cliente *p, *new;
while(c!=0)
{
printf("\nNella lista sono presenti %d clienti",i-1);
printf("\nE [%d] prenotazioni",j);
printf("\n\n\t1.crea nuovo cliente");
printf("\n\t2.cerca clienti");
printf("\n\t3.visualizza lista clienti");
printf("\n\t4.crea prenotazione");
printf("\n\t5.elenca lista prenotazioni");
printf("\n\t6.Salva lista cliente sul file di testo [listaclienti.txt]");
printf("\n\t7.Carica lista clienti da file [listaclienti.txt]");
printf("\n\nDigita la scelta ---->");
scanf("%d",&c);
switch(c)
{
case 1:
if (i==1)
{
p = crea();
i++;
new = p;
break;
}
else
{
new->next=malloc(sizeof(struct cliente));
new = inserisci(new->next);
break;
}
case 2: cerca(p); break;
case 3: visualizza(p); break;
case 4: menuprenotazione(p); break;
case 5: elenca(); break;
case 6: salvalista(p); break;
case 7:
p = creaprimo();
i++;
new = p;
new->next=malloc(sizeof(struct cliente));
new = creanext(new->next);
break;

}
}
}

struct cliente * crea()
{

struct cliente *p;

p = malloc(sizeof(struct cliente));

printf("\nInserisci nome del cliente ");
scanf("%s", p->nome);
printf("\nInserisci cognome ");
scanf("%s", p->cognome);
p->codice = 1;
printf("\nAl cliente è stato assegnato il codice [1]\n");
p->next=NULL;
return p;
}

struct cliente * inserisci(struct cliente *p)
{


printf("\nInserisci nome del cliente ");
scanf("%s", p->nome);
printf("\nInserisci cognome ");
scanf("%s", p->cognome);
p->codice = i;
printf("\nAl cliente è stato assegnato il codice [%d]\n",i);
i++;
p->next= NULL;

return p;
}

void cerca(struct cliente *p)
{
int codice;
printf("\ndigita il codice cliente---->");
scanf("%d", &codice);


do
{
if (p->codice==codice)
{
printf("\n\nil codice cliente appartiene a [ %s %s ]",p->nome,p->cognome);
}

}
while ((p = p->next) !=NULL);

}

void visualizza(struct cliente *p)
{

printf("[codice] [nome] [cognome]");
while (p!=NULL)
{
printf("\n [%d] %s %s\n",p->codice,p->nome,p->cognome);

p = p->next;
}
}
void menuprenotazione(struct cliente *p)
{
int sel;

printf("\nIl cliente che vuole prenotare e' gia' nella lista clienti?");
printf("\n1.si");
printf("\n2.no\nscelta---> ");
scanf("\n%d",&sel);

switch(sel)
{
case 1: menu(p); break;
case 2: printf("\nBisogna immettere i dati del cliente prima"); break;
default : printf("\nscelta non valida"); break;
}
}

void menu(struct cliente *p)
{
int state=0;
int giornoa;
int mesea;
int giornop;
int mesep;
int sel;
printf("\nImmettere codice cliente ->");
scanf("%d",&sel);
while (p!=NULL)
{
if (p->codice==sel)
{
printf("\nImmettere dati di arrivo per cliente [%s %s codice(%d)]",p->nome,p->cognome,p->codice);
do{
printf("\nImmettere mese di arrivo ");
scanf("%d",&mesea);
if(mesea>12)
do
{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&mesea);
}
while(!(mesea<=12));
printf("\nImmettere giorno di arrivo ");
scanf("%d",&giornoa);
if(mesea==11||mesea==4||mesea==6||mesea==9)
if(giornoa>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornoa);
}
while(!(giornoa<=30)||(giornoa>=31));
if(mesea==2)
if(giornoa>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornoa);
}
while(!(giornoa<=29));
printf("\nImmettere mese di partenza ");
scanf("%d",&mesep);
if((mesep>12)||(mesep<mesea))
do
{
printf("\nERRORE DATA NON VALIDA!\n");
printf("MESE: ");
scanf("%d",&mesep);
}
while(!((mesep<=12)&&(mesep>=mesea)));
printf("\nImmettere giorno di partenza ");
scanf("%d",&giornop);
if(mesep==11||mesep==4||mesep==6||mesep==9)
if(giornop>30)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornop);
}
while(!(giornop<=30)||(giornop>=31));
if(mesep==2)
if(giornop>29)
do{
printf("\nERRORE DATA NON VALIDA!\n");
printf("GIORNO: ");
scanf("%d",&giornop);
}
while(!(giornop<=29));

state=gestionedata(giornoa,mesea,giornop,mesep);

lista[j].codicecliente=p->codice;

}while(state==1);
}

p = p->next;
}
lista[j].giornoarrivo=giornoa;
lista[j].mesearrivo=mesea;
lista[j].giornopartenza=giornop;
lista[j].mesepartenza=mesep;
j++;
}

void elenca()
{
int t;
for(t=0;t<j;t++)
{
printf("\nPer il cliente con codice [%d]",lista[t].codicecliente);
printf("\ngiorno arrivo [%d] mese [%d]\n",lista[t].giornoarrivo,lista[t].mesearrivo);
printf("\ngiorno partenza [%d] mese [%d]\n\n\n",lista[t].giornopartenza,lista[t].mesepartenza);
}
}

int gestionedata(int giornoa,int mesea,int giornop,int mesep)
{
int sta=0;
int t;
int giornoarrivo=giornoa;
int giornopartenza=giornop;
for (t=0;t<mesea;t++)
{
giornoarrivo=giornoarrivo+calendario[t];
}
calend[j].arrivo=giornoarrivo;
for (t=0;t<mesep;t++)
{
giornopartenza=giornopartenza+calendario[t];
}
calend[j].partenza=giornopartenza;
if (j>0)
{
sta=controllo(giornoarrivo,giornopartenza);
return sta;
}
}


int controllo(int giornoarrivo,int giornopartenza)
{
int t;
for (t=0;t<j;t++)
{
if ((giornoarrivo>=calend[t].arrivo)&&(giornoarrivo<=calend[t].partenza)||(giornopartenza>=calend[t].arrivo)&&(giornopartenza<=calend[t].partenza))
{
printf("\nData non disponibile visualizzare l'elenco prenotazione e scegliere una prenotazione valida");
elenca();
return 1;
}
else
{
return 0;
}
}
}
void salvalista(struct cliente *p)
{
FILE *fp;

fp=fopen("listaclienti.txt","a+");


while (p!=NULL)
{
fprintf(fp,"\n%d %s %s",p->codice,p->nome,p->cognome);
p = p->next;
}
fclose(fp);

}

struct cliente *creaprimo()
{
struct cliente *p;
p=malloc(sizeof(struct cliente));

FILE *fp;

fp=fopen("listaclienti.txt","a+");


fscanf(fp,"%d %s %s",&p->codice,p->nome,p->cognome);
p->next=NULL;
fclose(fp);
return p;
}


struct cliente *creanext(struct cliente *p)
{
FILE *fp;

fp=fopen("listaclienti.txt","a+");

while(!feof(fp))
{
fscanf(fp,"%d %s %s",&p->codice,p->nome,p->cognome);
i++;
}
fclose(fp);
return p;
}



perchè cosi mi salva solo il primo e l'ultimo elemento?

Loading