9511_project01

project 1 for algorithms & programming I (9511) prof. Cardozo
Index Commits Files Refs README
main.c (3096B)
   1 //    
   2 //    Programa escrito por Martin J. KlÓ§ckner
   3 //        martin.cachari@gmail.com
   4 //        github.com/klewer-martin
   5 //
   6 //    Repositorio de github del proyecto:
   7 //            https://github.com/klewer-martin/9511_project01.git
   8 //            (Disponible a partir de la fecha de correccion)
   9             
  10 
  11 //    Lee texto de un archivo con extension .csv cuyo nombre recibe 
  12 //    como argumento; el cual contiene solo numeros que representan 
  13 //    un pais, una fecha y una cantidad de infectados y lo guarda en
  14 //    un archivo de texto cuyo nombre tambien recibe como argumento 
  15 //    con un formato humanamente entendible.
  16 
  17 
  18 #include "main.h"
  19 #include "macros.h"
  20 #include "arguments.h"
  21 #include "load_country_codes.h"
  22 #include "read_file.h"
  23 #include "print_file.h"
  24 #include "print_error.h"
  25 
  26 void free_array(char **arr)
  27 {
  28     for (size_t i = 0; i < COUNTRIES_NUMBER; i++)
  29          free(arr[i]);
  30 
  31     free(arr);
  32 }
  33 
  34 int main(int argc, char * argv[])
  35 {
  36     status_t st;
  37 
  38 //    Las siguientes variables son para guardar los nombres de los archivos de 
  39 //    entrada y salida luego de validar los argumentos
  40     char src[MAX_NAME_LENGTH];
  41     char dest[MAX_NAME_LENGTH];
  42 
  43     FILE *fpi, *fpo;
  44     uint country, date, infected;
  45 
  46     country = date = infected = 0;
  47 
  48     prev_month = prev_country = -1;
  49     infected_monthly = 0;
  50 
  51 //    Arreglo de arreglos de caracteres para guardar los codigos de los paises
  52     char **country_codes = (char **)malloc(COUNTRIES_NUMBER * sizeof(char *));
  53     for (size_t i = 0; i < COUNTRIES_NUMBER; i++)
  54          country_codes[i] = (char *)malloc(ARRAYS_LENGTH * sizeof(double));
  55 
  56 //    Valida de que los argumentos sean correctos y guarda los nombres de los
  57 //    archivos de entrada y salida en src y dest respectivamente
  58     if((st = validate_arguments(argc, argv, src, dest)) != OK) {
  59         free_array(country_codes);
  60         print_error(st);
  61         return st;
  62     }
  63 
  64 //    Carga los codigos de error de los paises de acuerdo al standard iso3166 en
  65 //    el arreglo mencionado previamente 'country_codes'  
  66     if((st = load_country_codes(country_codes)) != OK) {
  67         free_array(country_codes);
  68         print_error(st);
  69         return ERROR_LOADING_COUNTRY_CODES;    
  70     }
  71 
  72 //    Abre el archivo de entrada en modo lectura
  73     if((fpi = fopen(src, "r")) == NULL) {
  74         fclose(fpi);
  75         print_error(ERROR_READING_FILE);
  76         free_array(country_codes);
  77         return ERROR_READING_FILE;
  78     }
  79 
  80 //    Abre el archivo de salida en modo escritura
  81     if((fpo = fopen(dest, "w")) == NULL) {
  82         fclose(fpi);
  83         fclose(fpo);
  84         free_array(country_codes);
  85         print_error(ERROR_READING_FILE);
  86         return ERROR_READING_FILE;
  87     }
  88 
  89 //    Lee el archivo de entrada y va imprimiendo linea por linea en el de salida
  90     size_t line;
  91     for(line = 0; (st = read_file(fpi, &country, &date, &infected)) == OK; line++) {
  92         if(line != 0) {
  93             print_file(fpo, country_codes, &country, &date, &infected);
  94         }
  95     }
  96 
  97 
  98 //    Si hubo algun error al leer o escribir el archivo va a imprimir un error
  99     if((st != OK) && (st != END_OF_INPUT_FILE)) {
 100         free_array(country_codes);
 101         fclose(fpi);
 102         fclose(fpo);
 103         print_error(st);
 104         return st;
 105     }
 106 
 107 //    El la ultima linea de 'infectados por mes'
 108     fprintf_infected_monthly(fpo);
 109 
 110     fclose(fpi);
 111     fclose(fpo);
 112     free_array(country_codes);
 113     printf(MSG_OK);
 114     return OK;
 115 }