[C] funzione che legge da file e crea struttura

di il
1 risposte

[C] funzione che legge da file e crea struttura

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

  • Re: [C] funzione che legge da file e crea struttura

    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