
Originariamente inviata da
M.A.W. 1968
In primo luogo, è opportuno rispettare una sintassi meno emetica nella dichiarazione delle struct, perché quella proposta è davvero inguardabile. Ecco un esempio assai più felice e professionale:
codice:
typedef struct {
float temp;
char *nome1;
char *nome2;
} dato_t;
...
dato_t mieidati[365];
Oppure, per amor di sintesi (se non sono necessari nel codice altri riferimenti alla struct in oggetto):
codice:
struct {
float temp;
char *nome1;
char *nome2;
} mieidati[365];
In secondo luogo, l'uso di realloc() è fortissimamente deprecato poiché si tratta della funzione
di gran lunga più inefficiente di tutta la standard library, assieme alle degne compagne fscanf() e fprintf().
Il suo impiego va
scoraggiato in qualsiasi fase e a qualsiasi livello di preparazione.
L'idioma più razionale per la gestione di stringhe di dimensione non prefissata, lette da file dati, consiste nell'usare
uno o più buffer statici di dimensione esorbitante rispetto al caso peggiore previsto dalla specifica (o rilevato statisticamente, in mancanza di meglio), usato/i per la lettura del singolo dato da file. Il contenuto di tale buffer sarà poi, di volta in volta,
copiato (con una bella strncpy()) nel
buffer allocato dinamicamente, al quale punterà il relativo
puntatore previsto all'interno della struttura dati. Questo approccio, peraltro, in genere impedisce l'uso dell'orrida e deprecata fscanf() (che comunque non va
mai usata! Si legge l'intera riga e si usa sscanf(), semmai), in luogo di funzioni più efficienti e meno error-prone per la lettura di campi da file CDF o simili.
Causa mancanza di tempo e forzato uso di uno smartphone, non fornisco esempi di codice, anche per stimolare una crescita didattica nell'OP.