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 }