[C] funzione che legge da file e crea struttura

di Anonimizzato11065 il
1 risposte
Ciao ragazzi volevo proporvi il seguente esercizio:
Scrivere una funzione in linguaggio C che legga da un file di testo dati relativi ad un gruppo di oggetti. Il file di testo conterrà nella prima riga il numero totale di oggetti mentre nelle righe successive saranno presenti tre campi: il volume, il peso e il colore (espresso in RGB come array di 3 indici). La funzione dovrà allocare e restituire un vettore di strutture “oggetto” contenenti i dati letti dal file.

io l'ho fatto così:

typedef struct oggetto {
double volume,peso;
unsigned char colore[3];
} OGGETTO;

OGGETTO *elenco(char *fname, int*dim) {
FILE *fp;
OGGETTO *vect;
int i;
if ((fp = fopen(“fname”, “r”)) != NULL ) {
fscanf (fp, “%d\n”, dim);
vect = (OGGETTO*)calloc ((*dim)*sizeof(OGGETTO));
for (i=o; i<*dim; i++) {
vect.colore = (char*)calloc ((*dim)*sizeof(char));
}
for (i=0; i<*dim; i++) {
fscanf (fp, %d %lf %lf, vect.colore, &vect.volume, &vect.peso);
}
}
else {
perror (fname);
return NULL;
}
fclose (fp)
}
return vect;
}

potreste dirmi se è giusto o meno o dove ho sbagliato?

1 Risposte

  • Ma i dati li salvi in binario o in ascii ?
    Da come hai scritto il codice sembra la seconda.. ma per me complichi solo la faccenda, facendo tutto in binario:
    
    typedef struct {
     double volume, peso;
     unsigned char colore[3];
    } OGGETTO;
    
    int main (void)
    {
     FILE *fd;
     int cnt_obj, i;
     OGGETTO *objs = NULL;
     
     if ( !(fd = fopen ("file.txt", "rb")) )
          exit (EXIT_FAILURE);
     
     fread (&cnt_obj, sizeof (int), 1, fd);
     objs = (OGGETTO *) malloc (cnt_obj * sizeof (OGGETTO));
     for ( i = 0; i < cnt_obj; i++ ) {
           fread (&(objs[i].volume), sizeof (double), 1, fd);
           fread (&(objs[i].peso), sizeof (double), 1, fd);
           fread (objs[i].colore, sizeof (char), 3, fd);
     }
     fclose (fd);
     
     /* In `objs' hai tutti gli oggetti da 0 a cnt_obj - 1 */
     
     return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
1 risposte