commit 48dc7cb222d0131bbe2d2e35dbf5e18e912e08ed
parent 43888e070ce0d83cb1e1f9c58e8537f4c756e31d
Author: Martin J. Klöckner <64109770+klewer-martin@users.noreply.github.com>
Date: Sun, 7 Feb 2021 23:47:10 -0300
Merge pull request #7 from klewer-martin/beta
Updated source code, trying to separeta bigger functions into more
Diffstat:
5 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/Makefile b/Makefile
@@ -27,4 +27,4 @@ clean:
rm -f *.o
run:
- ./main -in input.csv
+ ./main -in input.csv -out output.txt
diff --git a/main.c b/main.c
@@ -53,7 +53,7 @@ int main(int argc, char * argv[])
return ERROR_LOADING_COUNTRY_CODES;
}
- if((st = readlines(src, dest)) != OK) {
+ if((st = readlines(src, dest, country_codes)) != OK) {
print_error(st);
return st;
}
diff --git a/output.txt b/output.txt
@@ -10,6 +10,8 @@ Pais: Argentina
Fecha: 15 Jan 2020
Infectados: 9324
+Infectados por mes: 16589
+
Pais: Colombia
Fecha: 01 Jan 2020
Infectados: 8234
@@ -22,6 +24,8 @@ Pais: Colombia
Fecha: 15 Jan 2020
Infectados: 9423
+Infectados por mes: 35246
+
Pais: Germany
Fecha: 01 Jan 2020
Infectados: 8432
diff --git a/readlines.c b/readlines.c
@@ -5,7 +5,7 @@
const char formato_de_la_fecha[] = "%d %b %Y";
-status_t readlines(char *src, char *dest)
+status_t readlines(char *src, char *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
{
size_t line, i, j;
status_t st;
@@ -29,13 +29,16 @@ status_t readlines(char *src, char *dest)
unsigned long date;
unsigned long infected;
-// Arreglo para almacenar los codigos de los paises segun el standard iso3166-1,
- char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH];
+ unsigned long prev_country;
-// Carga los datos al arreglo mencionado previamente, en caso de haber algun
-// error devuelve el codigo de dicho error;
- if((st = load_country_codes(country_codes)) != OK)
- return st;
+ char time_s[TIME_MAX_DIGITS];
+ unsigned int month;
+ unsigned int prev_month;
+
+// Inizializamos la variable country en cero;
+ prev_country = 0;
+ prev_month = -1;
+ unsigned long infected_monthly;
// Abre el archivo de entrada en modo lectura si por algun motivo no se puede
// abrir devuelve un codigo de error;
@@ -55,7 +58,6 @@ status_t readlines(char *src, char *dest)
// un pais, una fecha o el numero de infectados;
for(i = 0, j = 0, data = PAIS; buff1[i] != '\0'; i++)
{
-
// Si encuentra una coma cambia el tipo de dato;
if((buff1[i] == ','))
{
@@ -66,7 +68,9 @@ status_t readlines(char *src, char *dest)
// coma va a guardarlo de distinta manera, ej: si el dato que
// se guardo en buff2 era el codigo de un PAIS, entonces lo
// guarda en la variable country, si el tipo de dato que se
-// guardo en buff2 era una fecha entonces lo guarda en date, etc;
+// guardo en buff2 era una fecha entonces lo guarda en date, etc.
+// Solo puede ser PAIS o DATE, ya que INFECTADOS seria cuando
+// ecuentra un caracter de nueva linea;
switch(data)
{
case PAIS: country = atoi(buff2); break;
@@ -110,9 +114,30 @@ status_t readlines(char *src, char *dest)
case INFECTED: buff2[j] = buff1[i]; j++; break;
}
}
+
+ time_translator(date, time_s, sizeof(time_s), "%m");
+ month = atoi(time_s);
+ printf("%d\n", month);
+
+ if(prev_country == 0 && prev_month == -1) {
+ prev_country = country;
+ prev_month = month;
+ }
+
+// Imprime la suma de infectados por mes cada vez que cambia el pais;
+ if(country == prev_country && month == prev_month) {
+ infected_monthly += infected;
+ }
+ else if(country != prev_country) {
+ fprintf(fpo, "Infectados por mes: %lu\n\n", infected_monthly);
+ prev_country = country;
+ }
+
+// Imprime datos segun el archivo de entrada;
fprintf_country(fpo, country, country_codes);
fprintf_date(fpo, date);
- fprintf_infected(fpo, infected);
+ fprintf_infected(fpo, infected, '\n');
+
}
}
@@ -122,7 +147,6 @@ status_t readlines(char *src, char *dest)
}
-
status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
{
if((country_codes == NULL) || (dest == NULL))
@@ -140,19 +164,19 @@ status_t fprintf_date(FILE *dest, size_t date)
if(dest == NULL)
return ERROR_NULL_POINTER;
- if((st = time_translator(date, time_c, sizeof(time_c))) != OK)
+ if((st = time_translator(date, time_c, sizeof(time_c), formato_de_la_fecha)) != OK)
return st;
fprintf(dest, "Fecha: %s\n", time_c);
return OK;
}
-status_t fprintf_infected(FILE *dest, size_t infected)
+status_t fprintf_infected(FILE *dest, size_t infected, char newline)
{
if(dest == NULL)
return ERROR_NULL_POINTER;
- fprintf(dest, "Infectados: %lu\n\n", infected);
+ fprintf(dest, "Infectados: %lu\n%c", infected, newline);
return OK;
}
@@ -169,12 +193,15 @@ status_t clean_buffer(char *buffer, size_t size)
}
-status_t time_translator(time_t unix_time, char *res, size_t size)
+
+// Traduce de la fecha de formato unix a format y lo guarda en res como
+// como una cadena de caracteres;
+status_t time_translator(time_t unix_time, char *res, size_t size, const char *format)
{
- if(res == NULL)
+ if(res == NULL || format == NULL)
return ERROR_NULL_POINTER;
- const char *format = formato_de_la_fecha;
+
struct tm *tmp = gmtime(&unix_time);
if (strftime(res, size, format, tmp) == 0) {
diff --git a/readlines.h b/readlines.h
@@ -20,11 +20,11 @@ typedef enum {
INFECTED
} data_t;
-status_t readlines(char *src, char *dest);
+status_t readlines(char *src, char *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
status_t fprintf_date(FILE *dest, size_t data);
-status_t fprintf_infected(FILE *dest, size_t data);
+status_t fprintf_infected(FILE *dest, size_t data, char newline);
status_t clean_buffer(char *buffer, size_t size);
-status_t time_translator(time_t unix_time, char *res, size_t size);
+status_t time_translator(time_t unix_time, char *res, size_t size, const char *format);
status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
#endif