[C] esercizio con file e allocazione dinamica di struct in memoria
salve,
devo svolgere il seguente esercizio:
Si scriva una funzione che legge dal file Prova3Dati.txt (fornito) dei dati relativi a una rilevazione di una centralina per il controllo climatico, da memorizzare in una struct allocata con malloc, il cui puntatore va inserito nell'array Dati, nella posizione corrispondente al codice identificativo della centralina da cui sono ricavati i dati. Se il codice della centralina e' superiore al valore massimo dell'indice dell'array (ad esempio 10 o 25, se l'array e' lungo 10 posizioni (indici da 0 a 9)), o se la posizione corrispondente e' gia' occupata, viene stampato a video un messaggio d'errore con tutti i dati, e questi non vengono inseriti. L'array ha al massimo 10 posizioni.
questa è la struct su cui memorizzare i dati:
E questo è la funzione per leggere i file:
vorrei sapere se va bene perchè poi l'esercizio continua e non vorrei aver sbagliato le basi, grazie in anticipo.
devo svolgere il seguente esercizio:
Si scriva una funzione che legge dal file Prova3Dati.txt (fornito) dei dati relativi a una rilevazione di una centralina per il controllo climatico, da memorizzare in una struct allocata con malloc, il cui puntatore va inserito nell'array Dati, nella posizione corrispondente al codice identificativo della centralina da cui sono ricavati i dati. Se il codice della centralina e' superiore al valore massimo dell'indice dell'array (ad esempio 10 o 25, se l'array e' lungo 10 posizioni (indici da 0 a 9)), o se la posizione corrispondente e' gia' occupata, viene stampato a video un messaggio d'errore con tutti i dati, e questi non vengono inseriti. L'array ha al massimo 10 posizioni.
questa è la struct su cui memorizzare i dati:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 10 typedef enum {monday,tuesday,wednesday,thursday,friday,saturday,sunday}tipogiorno; struct strcentralina{ int cent; float temperatura; float umidita; float polveri_sottili; int giorno; int mese; int anno; tipogiorno giornosettimana[10];}; typedef struct strcentralina centralina;
E questo è la funzione per leggere i file:
void leggiFile(char* nomefile,centralina *dati, int a) { centralina* centr= malloc(sizeof(centralina)); int Dati=10; centralina* cent_n=malloc(Dati*sizeof(centralina)); FILE* file=fopen("Prova 3- Dati.txt", "r"); int i; for(i=0;i<Dati;i++){ char TmP[15]; int res=fscanf(file,"%d %f %f %f %s %d %d %d",&(cent_n[i].cent),&(cent_n[i].temperatura),&(cent_n[i].umidita),&(cent_n[i].polveri_sottili),TmP,&(cent_n[i].giorno),&(cent_n[i].mese),&(cent_n[i].anno)); if(res==EOF) { break; } cent_n[i].giornosettimana[0]=ConvertiGiorno(TmP); } free(centr); free(cent_n); fclose(file); }
vorrei sapere se va bene perchè poi l'esercizio continua e non vorrei aver sbagliato le basi, grazie in anticipo.
Risposte
Analizziamo per bene il testo.
Questo si traduce in
Dal testo direi che l'array Dati deve essere definito come:
[...] da memorizzare in una struct allocata con malloc [...]
Questo si traduce in
centralina * cen = malloc(sizeof(centralina));come hai giustamente pensato.
[...] il cui puntatore va inserito nell'array Dati [...]
Dal testo direi che l'array Dati deve essere definito come:
centralina * Dati[10] = { 0 };mentre l'inserimento del struttura avrà la forma
if(i < 10) { Dati[i] = cen; } else { // ... }
così?
void leggiFile(char* nomefile,centralina *dati, int a) { centralina* cent_n= malloc(sizeof(centralina)); centralina * Dati[10]={0}; FILE* file=fopen("Prova 3- Dati.txt", "r"); int i; if(i<10) { Dati[i]=cent_n;} else{Dati[i]!=cent_n;} for(i=0;i<10;i++) {char TmP[15]; fscanf(file,"%d %f %f %f %s %d %d %d",&(cent_n[i].cent),&(cent_n[i].temperatura),&(cent_n[i].umidita),&(cent_n[i].polveri_sottili),TmP,&(cent_n[i].giorno),&(cent_n[i].mese),&(cent_n[i].anno)); cent_n[i].giornosettimana[0]=ConvertiGiorno(TmP); } free(cent_n); fclose(file); }
No, l'array va passato alla funzione perché va riempito dalla funzione (insomma dopo aver letto il file ci vorrai ancora lavorare). Quindi la funzione dovrebbe essere definita come
Tu passi alla funzione 3 dati e non ne usi nessuno. Il numero del file usato qui
void leggiFile(char* nomefile, centralina * dati[], int n)o come
void leggiFile(char* nomefile, centralina * dati[10])(o altre definizioni più o meno equivalenti).
Tu passi alla funzione 3 dati e non ne usi nessuno. Il numero del file usato qui
FILE* file=fopen(numefile, "r");