-
Notifications
You must be signed in to change notification settings - Fork 0
/
gest_countries.c
156 lines (118 loc) · 4.65 KB
/
gest_countries.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "includes/gestdata.h"
#include "includes/utils.h"
#define MAX_CODE2_SIZE 2
#define MAX_CODE3_SIZE 3
#define MAX_COUNTRY_SIZE 50
#define MAX_COUNTRIES 100
typedef struct {
char code2[MAX_CODE2_SIZE+1];
char code3[MAX_CODE3_SIZE+1];
char country[MAX_COUNTRY_SIZE+1];
} COUNTRY;
typedef struct {
COUNTRY arr[MAX_COUNTRIES];
int count;
} LIST_COUNTRIES;
int read_country_from_txt_file(FILE*fp, COUNTRY *country);
void show_country(COUNTRY country);
void show_countries(LIST_COUNTRIES list);
int compare(const void *p1, const void *p2);
// Programa de demonstracao de processamento de registos de paises
void manage_countries(){
LIST_COUNTRIES list_countries;
list_countries.count = 0; // Nao ha paises na lista
char aux[MAX_STRING];
wait("Importar o ficheiro csv com os paises. Prima <ENTER>...");
// Importar os dados do ficheiro para a lista de countries
FILE *fp; // Ficheiro para importar os dados.
sprintf(aux, "%s/%s", "datasets", "countries.csv");
if ((fp=fopen(aux, "rt"))==NULL)
{
wait("Problemas na abertura do ficheiro de paises.");
return;
}
while (read_country_from_txt_file(fp, &list_countries.arr[list_countries.count])) // Enquanto conseguir ler um registo
{
printf("Ler registo de ficheiro de texto #%d\n", ++list_countries.count);
}
fclose(fp);
wait("\n\nGravar num ficheiro binario os registos lidos. Prima <ENTER>...");
FILE *fp_country;
if ((fp_country = open_data_file(DIR_DATA, DATA_FILE_COUNTRY))==NULL) // Abrir o ficheiro de dados
return;
int n_recs = fwrite(list_countries.arr, sizeof(COUNTRY), (long) list_countries.count, fp_country);
if (n_recs!=list_countries.count)
{
wait("Problemas na gravacao dos registos no ficheiro binario. Prima <ENTER>...");
return;
}
else
{
fflush(fp_country); // just in case
fclose(fp_country);
wait("Registos gravados com sucesso. Prima <ENTER>...");
}
puts("\n\nLimpar a lista de registos em memoria."); list_countries.count=0; // Lista vazia.
wait("Ler a lista de registos a partir do ficheiro binario. Prima <ENTER>...");
if ((fp_country = open_data_file(DIR_DATA, DATA_FILE_COUNTRY))==NULL) // Abrir o ficheiro de dados
return ;
while (fread(&list_countries.arr[list_countries.count], sizeof(COUNTRY), 1L, fp_country)==1)
{
list_countries.count++;
printf("Ler registo de ficheiro binario #%d\n", list_countries.count);
}
fclose(fp_country);
wait(NULL);
puts("------------ Registos de paises lidos a partir do ficheiro binario ------------");
show_countries(list_countries);
wait(NULL);
wait("\n\nOrdenar lista de pessoas pelo nome do pais. Tome atencao as posicoes de Portugal e Espanha. Prima <ENTER>...");
qsort(list_countries.arr, (long) list_countries.count, sizeof(COUNTRY), compare);
puts("------------ Registos de paises apos ordenacao por nome do pais ------------");
show_countries(list_countries);
wait(NULL);
puts("\n\nProcura binaria do pais {PT POR Portugal} na lista ordenada de paises.");
COUNTRY p = {"PT","POR","Portugal"};
COUNTRY *ptr = bsearch(&p, list_countries.arr, (long) list_countries.count, sizeof(COUNTRY), compare);
if (ptr!=NULL)
{
show_country(*ptr);
wait("Encontrado o pais PT POR Portugal\n\n");
}
else
wait("NAO FOI ENCONTRADO pais PT POR Portugal\n\n");
puts("\n\nProcura binaria do pais {PT POR Portugallo} na lista ordenada de paises.");
strcat(p.country,"lo"); // Juntar "lo" a "Portugal" para se obter "Portugallo"
ptr = bsearch(&p, list_countries.arr, (long) list_countries.count, sizeof(COUNTRY), compare);
if (ptr!=NULL)
{
show_country(*ptr);
wait("Encontrado o pais PT POR Portugallo\n\n");
}
else
wait("NAO FOI ENCONTRADO pais PT POR Portugallo\n\n");
wait("That's all!!!");
}
// Read one contry in file.
// Return boolean
int read_country_from_txt_file(FILE*fp, COUNTRY *country) {
int n_fields = fscanf(fp, "%s %s %[^\n]s", country->code2, country->code3, country->country);
return (n_fields == 3); // Sucesso se foram lidos 3 campos
}
// show one country
void show_country(COUNTRY country){
printf("%s %s %s\n", country.code2, country.code3, country.country);
}
// show all countries in the list
void show_countries(LIST_COUNTRIES list){
for (int i=0; i<list.count; i++)
show_country(list.arr[i]);
}
int compare(const void*ptr1, const void* ptr2){
COUNTRY *p1 = (COUNTRY *) ptr1;
COUNTRY *p2 = (COUNTRY *) ptr2;
return strcmp(p1->country, p2->country);
}