#include #include #include #define DELIM ";" #define BUFF_SIZE 128 char buff [BUFF_SIZE]; // compiler says char instead of const char because in fgets ( char *, int , FILE *) FILE * file = NULL; typedef struct { char * Time; char * pt10001; char * pt10002; char * temp1; char * temp2; } temperature_infos; //int c ; typedef enum { TIME, PT10001, PT10002, TEMP1, TEMP2, NB_TYPE } infos_type; static char * str_dup (const char * str) { char * dup = NULL; if (str != NULL) { size_t size = strlen (str) + 1; dup = malloc (size); if (dup != NULL) { memcpy (dup, str, size); } } return dup; } int openFile(const char * filename, FILE * dest){ file = fopen (filename, "r"); if(file == NULL){ return 0; }else{ return 1; } } static temperature_infos * get_temp (FILE * file, int nbLines) { temperature_infos * infos = NULL; char * token = NULL; int i = 0; temperature_infos *tabTemp= malloc (sizeof(temperature_infos)* nbLines); if (file != NULL) { while ((fgets (buff, BUFF_SIZE, file)) != NULL) { char * p = buff; int field = 0; infos = malloc (sizeof (* infos)); if (infos != NULL) { while ((token = strtok (p, DELIM)) != NULL) { if (field == 0) p = NULL; switch (field) { case TIME: infos->Time = str_dup (token); break; case PT10001: infos->pt10001 = str_dup (token); break; case PT10002: infos->pt10002 = str_dup (token); break; case TEMP1: infos->temp1 = str_dup (token); break; case TEMP2: infos->temp2 = str_dup (token); break; default: break; } field++; } } tabTemp[i] = *infos; i++; } } return tabTemp; } static void free_temperature_infos (temperature_infos * p) // L'erreur sur ce code se trouve dans cette fonction { // note: expected "struct temperature_infos**" but argument is type of if (p != NULL ) // " struct temperature_infos * " { free (p->Time); // si on garde "p" on a l'erreur valable pour toute les variables Time pt10001 etc... qui est : free (p->pt10001);// request for member 'Time' in something not a structure or a union ... free (p->pt10002); free (p->temp1); free (p->temp2); p = NULL; // imcompatible types when assigning to type 'temperature_infos' from type 'void*' } // à cause de l'erreur sur la ligne 137 dc je rajoute a la ligne (*)*p } // Nous avons les mêmes erreurs sauf pour la derniere ligne p=NULL; // dc cele ne sert à rien de rajouter * à *p. int countNbLines(FILE* file){ int cpt = 0; while(fgets(buff, BUFF_SIZE ,file)) { cpt++; } return cpt; } int main (void) { FILE * file = NULL; if(openFile("Autoclave12.csv",file)==0){ perror("Error on file oppening"); return EXIT_FAILURE; } int nbLines = countNbLines(file); temperature_infos * infos = get_temp (file, nbLines); fclose (file); if (infos != NULL) { printf ( "Time(sec): %s\nPT10001(Celsius): %s\nPT10002(Celsius): %s\nTemp1(Celsius): %s\nTemp2(Celsius):%s\n", infos->Time, infos->pt10001, infos->pt10002, infos->temp1, infos->temp2 ); free_temperature_infos (infos); // Warning: passing argument 1 of "free_temperature_infos" from incompatible pointer type } // Enable by default. return EXIT_SUCCESS; }