Ciao!!
Sono alle prime armi in C, quindi !!!
Devo leggere da file (.txt), della forma:
Nomeservizio|giorni
-| stazione_di_partenza| ora_di_partenza
ora_di_Arrivo|nomestazione|ora_di_partenza
…..
…...
oraDiArrivo|nomestazione|-
<riga vuota>
si ricomincia come sopra.
Sono di tipo char * : NomeServizio, giorni, stazioni_di_partenza e nomestazione, mentre per rappresentare l'ora, ho utilizzato la struct tm definita in time.h.....
Questo file deve essere salvato in un vettore dinamico.... Per far questo ho definito due strutture
struct servizio {
char * nome;
char *giorni;
char * stazioniP;
struct tm * oraP1;
struct tm * oraA;
char ** stazioniA; /*se non sbaglio è un vettore di vettori (char)*/
struct tm * oraP2;
short lenSotVector;
};
Giusto utilizzare i puntatori nella struttura ?!?
in seguito:
struct servizzi {
struct servizio * srvzi; /*vettore di strutture servizio*/
unsigned short size; /*capacita del vettore*/
unsigned short element; /*numero di elementi contenuti in srvzi*/
};
Utilizzo la seguente funzione per allocare memoria:
struct servizzi * nuoviServizzi () {
struct servizzi * t = (struct servizzi *)calloc (MAX,sizeof (struct servizio));
t->size = MAX;
t->element = 0;
t->srvzi = (struct servizio *) malloc (MAX * sizeof(struct servizio));
return t;
}
MAX è una costante....
A questo punto posso scrivere la funzione:
void loadServizzi(struct servizzi * ser, FILE * in ) {
struct servizio * t = ser->srvzi;
struct tm * ooraA; /*puntatore al sottovettore oraA*/
struct tm * ooraP2;/*puntatore al sottovettore oraP2*/
char ** ostazioniA; /*puntatore al vettore di vettori*/
int e = 1;
int i =1;
int j =0;
char * line = (char *) malloc (MAXSTRLEN * sizeof(char));
while (e != EOF) {
/*Si legge il nome del servizio*/
e = freadLine (in,line);
t->nome = (char *) malloc (strlen(line) * sizeof(char));
if (t->nome==NULL){
printf("Fallimento");
exit(1);
}
strcpy(t->nome,line);
clearLine (line);
/*Si leggono i giorni di servizio*/
e = freadLine (in,line);
t->giorni = (char *) malloc (strlen(line)*sizeof(char));
strcpy(t->giorni,line);
clearLine(line);
/*si leggono i caratteri -|*/
getc(in);
getc(in);
/*Si legge il nome della stazione di partenza*/
e = freadLine (in,line);
t->stazioniP = (char *) malloc (strlen(line)*sizeof(char));
strcpy(t->stazioniP,line);
clearLine(line);
/*si legge l'ora di partenza*/
t->oraP1 = (struct tm *) malloc (sizeof(struct tm));
e= freadLine(in,line);
t->oraP1->tm_hour = atoi(line);
clearLine(line);
e = freadLine(in,line);
t->oraP1->tm_min = atoi(line);
clearLine(line);
/*Inizia la lettura iterativa*/
//Si allocano i puntatori ai sottovettori:
t->oraA = (struct tm *) malloc (MAX * sizeof(struct tm));
ooraA = t->oraA;
t->oraP2 = (struct tm *) malloc (MAX * sizeof(struct tm));
ooraP2 = t->oraP2;
t->stazioniA = (char **) malloc (MAX* sizeof(char *));
ostazioniA = t->stazioniA;
j=0;
do {
/*si legge l'ora di arrivo*/
e = freadLine(in,line);
ooraA->tm_hour = atoi(line);
clearLine(line);
e = freadLine(in,line);
ooraA->tm_min = atoi(line);
clearLine(line);
/**si legge la stazione di destinazione/arrivo */
e = freadLine(in,line);
*ostazioniA = (char *) malloc (strlen(line)*sizeof(char));
strcpy(*ostazioniA,line);
clearLine(line);
e = freadLine (in,line);
if (*line != '-') {
/*Allora si legge l'ora di partenza*/
ooraP2->tm_hour = atoi(line);
clearLine(line);
e = freadLine(in,line);
ooraP2->tm_min = atoi(line);
}
j++;
if (j >= i*MAX){
/*Riallocazione dei sottovettori */
i++;
t->oraA = (struct tm *) realloc (t- >oraA,i*MAX*sizeof(struct tm));
t->oraP2 = (struct tm *) realloc (t- >oraP2,i*MAX*sizeof(struct tm));
t->stazioniA = (char **) realloc (t- >stazioniA,i*MAX*sizeof(char *));
}
ooraA++;
ooraP2++;
ostazioniA++;
}while (*line != '-');
t->lenSotVector = j;
/*Si deve leggere una stringa vuota meglio un cliclo che trovi
* la prossima stringa non vuota si farà...
*/
if (e != EOF) {
e = freadLine (in, line);
clearLine(line);
}
ser->element++;
if (ser->element >= ser->size){
ser->size= 2* ser->size;
ser->srvzi = (struct servizio *) realloc (ser->srvzi,ser->size * MAX*sizeof(struct servizio));
}
v
t++;
}
free(line);
}
La mia domanda è la seguente: questa funzione (loadServizzi) è corretta Che?!? Perchè se leggo un file che contiene poche informazioni, non ci sono problemi, invece se leggo qualcosa di più pesante, la funzione si blocca.... Ovviamente nella versione che consegnerò di loadServizzi; ogni malloc e realloc viene controllata, (in caso NULL ….). Grazie 100000!!!!!!!!!!
La funzione freadline:
short freadLine (FILE * in, char * line ) {
char * p = line;
char t;
while ((t = getc(in)) != EOF && t != '|' && t != '\n' && t != ':') {
*p++ = t;
}
*p = '\0';
return t;
}
Un possibile file:
FS1025|123
-|Livorno|11:30
12:30|Pisa|12:35
12:40|Pisa S.Rossore|-
Comunque non male per iniziare !!!! Ancora grazie!!!!