Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.36 KB | None | 0 0
  1. #define _POSIX_C_SOURCE 200809L
  2. #define _GNU_SOURCE
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "lista.h"
  7. #include "heap.h"
  8. #include "modificaciones_tda.c"
  9.  
  10. typedef struct linea_registro {
  11.   char* ip;
  12.   char* fecha;
  13.   char* recurso;
  14.   char* ruta;
  15. } linea_registro_t;
  16.  
  17.  
  18. linea_registro_t* crear_registro(){
  19.   linea_registro_t* registro = malloc(sizeof(linea_registro_t));
  20.   if(!registro) return NULL;
  21.   registro->ip = NULL;
  22.   registro->fecha = NULL;
  23.   registro->recurso = NULL;
  24.   registro->ruta = NULL;
  25.   return registro;
  26. }
  27.  
  28. void cargar_registro(linea_registro_t* registro,char* linea){
  29.   char** campos = split(linea,'\t');
  30.   registro->ip=strdup(campos[0]);
  31.   registro->fecha=strdup(campos[1]);
  32.   registro->recurso=strdup(campos[2]);
  33.   registro->ruta=strdup(campos[3]);
  34.   free_strv(campos);
  35. }
  36.  
  37. void registro_destruir(linea_registro_t** registro,size_t TAM_REGISTRO){
  38.   for(size_t i=0;i<TAM_REGISTRO;i++){
  39.      if(registro[i]){
  40.          free((char*)registro[i]->ip);
  41.          free((char*)registro[i]->fecha);
  42.          free((char*)registro[i]->recurso);
  43.          free((char*)registro[i]->ruta);
  44.       }
  45.     free(registro[i]);
  46.   }
  47.   free(registro);
  48. }
  49.  
  50. /*Esta funcion se encarga de cargar una particion con sus K lineas correspondientes.*/
  51. void cargar_particion(FILE* log_original,FILE* particion,size_t K_LINEAS){
  52.   printf("---CARGAR PARTICION---\n\n");
  53.   linea_registro_t** lineas_particion;
  54.   lineas_particion = malloc(sizeof(linea_registro_t*)*K_LINEAS);
  55.   char* linea=NULL;
  56.   size_t tam_linea = 0;
  57.   for(size_t l=0; l<K_LINEAS && (getline(&linea,&tam_linea,log_original)!=-1);l++){
  58.         lineas_particion[l] = crear_registro();
  59.         cargar_registro(lineas_particion[l],linea);
  60.         printf("%s ",lineas_particion[l]->ip);
  61.         printf("%s\n",lineas_particion[l]->fecha);
  62.   }
  63.   free(linea);
  64.   registro_destruir(lineas_particion,K_LINEAS);
  65. }
  66.  
  67. void ordenar_archivo(const char* archivo, size_t memoria){
  68.  
  69.   FILE* log_original = fopen(archivo,"r");
  70.   if(!log_original) return;
  71.   //Cuento las lineas y la linea mas grande.
  72.   size_t cantidad_lineas_archivo = 0;
  73.   size_t tam_max_linea = 0;
  74.  
  75.  
  76.   char* linea=NULL;
  77.   size_t tam_linea = 0;
  78.   while(getline(&linea,&tam_linea,log_original)!=-1){
  79.       if(tam_linea>tam_max_linea) tam_max_linea=tam_linea;
  80.       cantidad_lineas_archivo++;
  81.   }
  82.  
  83.   free(linea);
  84.   size_t K_PARTICIONES = memoria / tam_max_linea;
  85.   size_t K_LINEAS = (cantidad_lineas_archivo / K_PARTICIONES ) + 1;
  86.   fseek( log_original, 0, SEEK_SET );
  87.  
  88.   //Hago un vector de particiones  y  c/u lo cargo con K lineas.
  89.   FILE* particiones_temporales[K_PARTICIONES];
  90.  
  91.  
  92.   for(size_t i = 0 ;i<K_PARTICIONES;i++){
  93.     char filename[50];
  94.     sprintf(filename,"particion%zu.bin",i);
  95.     printf("%s\n",filename);
  96.     particiones_temporales[i] = fopen(filename,"wb");
  97.  
  98.     cargar_particion(log_original,particiones_temporales[i],K_LINEAS);
  99.  
  100.     fclose(particiones_temporales[i]);
  101.   }
  102.   fclose(log_original);
  103. }
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113. int main(int argc, char* argv[]){
  114.     if(argc !=3){
  115.       fprintf(stderr, "Cantidad de parametros erronea\n");
  116.       return 1;
  117.     }
  118.  
  119.     const char* archivo_log = argv[1];
  120.     const size_t memoria = atoi(argv[2]);
  121.  
  122.     if(memoria==0){
  123.       fprintf(stderr,"Parametro memoria incorrecto");
  124.       return 0;
  125.     }
  126.  
  127.     ordenar_archivo(archivo_log,memoria);
  128.  
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement