Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Problema con il C

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    8

    Problema con il C

    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!!!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Ciao e benvenuto nel forum di Programmazione.

    Ti segnalo da subito la lettura del nostro Regolamento che contiene tutte le norme da seguire per partecipare correttamente a quest'area del forum.

    In modo particolare, devi sempre indicare il linguaggio utilizzato nel titolo della discussione, indicando la versione nel caso in cui ne esistesse più di una, assieme ad una sintesi breve ma significativa ed esplicativa del problema.

    Inoltre, il codice va specificato usando il tag [CODE ] (tasto #), in modo che appaia formattato correttamente e sia quindi comprensibile.

    Apri una nuova discussione seguendo le regole indicate qui e nel regolamento segnalato.

    Detto questo, ciao e...buon forum!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.