Code:
typedef struct city_t{
char city_id[TAM_STR];
char city_name[TAM_STR];
char county_name[TAM_STR];
char district_name[TAM_STR];
} city_t;
typedef struct meteo_t{
char meteo_id[TAM_STR];
char meteo_city_id[TAM_STR];
char tempt_max[TAM_STR];
char tempt_min[TAM_STR];
char humidity[TAM_STR];
char preassure[TAM_STR];
char date[11];
} meteo_t;
meteo_t *read_meteo(const char *filename, size_t *len)
{
if(filename == NULL || len == NULL)
return NULL;
FILE *fp = fopen(filename, "r");
if(fp == NULL)
{
fprintf(stderr, "Could not open %s: %s\n", "meteo.csv", strerror(errno));
return NULL;
}
meteo_t *arr = NULL, *tmp;
*len = 0;
char line[1024];
while(fgets(line, sizeof line, fp))
{
tmp = realloc(arr, (*len + 1) * sizeof *arr);
if(tmp == NULL)
{
fprintf(stderr, "could not parse the whole file %s\n", "meteo.csv");
if(*len == 0)
{
free(arr);
arr = NULL;
}
return arr;
}
arr = tmp;
sscanf(line, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%s", (arr[*len].meteo_id), (arr[*len].meteo_city_id), (arr[*len].tempt_max), (arr[*len].tempt_min), (arr[*len].humidity), (arr[*len].preassure), (arr[*len].date));
(*len)++;
}
fclose(fp);
if(*len == 0)
{
free(arr);
arr = NULL;
}
return arr;
}
void print_all_meteo(meteo_t *meteo, city_t *cities, size_t len)
{
if(meteo == NULL || cities == NULL)
return;
for(size_t i = 0; i < len; ++i) {
int id = atoi(meteo[i].meteo_city_id);
printf("ID: %s \n city: %s\n maximum temperature: %s\n minimum temperature: %s\n humidity: %s\n pressure: %s\n, date: %s\n", meteo[i].meteo_id, cities[id].city_name, meteo[i].tempt_max, meteo[i].tempt_min, meteo[i].humidity, meteo[i].preassure, meteo[i].date);
}
}
meteo_t *delete_meteo_id(meteo_t *meteo, const int id, size_t len, size_t *new_meteo_len) {
*new_meteo_len=0;
bool deleted = false;
struct meteo_t *new_meteo;
new_meteo = (struct meteo_t *)malloc((*new_meteo_len + 1)*sizeof(struct meteo_t));
for(size_t i = 0; i < len; ++i) {
int meteo_id = atoi(meteo[i].meteo_id);
if (id == meteo_id || deleted == true) {
new_meteo[i] = meteo[i + 1];
deleted = true;
(*new_meteo_len)++;
} else {
new_meteo[i] = meteo[i];
}
}
if (deleted == false) {
printf("id %d not found", id);
return NULL;
}
return new_meteo;
}
void removeInfo() {
size_t cities_len;
city_t *cities = read_cities("cities.csv", &cities_len);
if(cities == NULL) {
printf("ERROR");
}
size_t meteo_len;
meteo_t *meteo = read_meteo("meteo.csv", &meteo_len);
if(meteo == NULL) {
printf("ERROR");
}
print_all_meteo(meteo, cities, meteo_len);
int delete_id;
printf("What is the id you desire to remove: ");
scanf("%d", &delete_id);
size_t new_meteo_len;
meteo_t *new_meteo=delete_meteo_id(meteo, delete_id, meteo_len, &new_meteo_len);
if(new_meteo == NULL) {
return;
}
FILE *fp = fopen("meteo.csv", "wb");
if(fp == NULL)
{
fprintf(stderr, "Unable to open the file meteo.csv: %s\n", strerror(errno));
free(new_meteo);
}
print_meteo(new_meteo, meteo_len -1, fp);
fclose(fp);
free(new_meteo);
}
(All my codes are so long... Sorry about that...)