Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.00 KB | None | 0 0
  1. #define _POSIX_C_SOURCE 200809L
  2. #define _GNU_SOURCE
  3.  
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "lista.h"
  8. #include "heap.h"
  9. #include "modificaciones_tda.c"
  10.  
  11. #define SIZE 1024
  12. //#include "tp2.h"
  13. //#include "interfaz.c"
  14.  
  15. //Necesito definifr un parametro para C.
  16.  
  17. typedef struct linea_registro {
  18.   char* ip;
  19.   char* fecha;
  20.   char* recurso;
  21.   char* ruta;
  22. } linea_registro_t;
  23.  
  24.  
  25. linea_registro_t* crear_registro(){
  26.   linea_registro_t* registro = malloc(sizeof(linea_registro_t));
  27.   if(!registro) return NULL;
  28.   registro->ip = NULL;
  29.   registro->fecha = NULL;
  30.   registro->recurso = NULL;
  31.   registro->ruta = NULL;
  32.   return registro;
  33. }
  34.  
  35. void registro_destruir(linea_registro_t** registro,size_t TAM_REGISTRO){
  36.   for(size_t i=0;i<TAM_REGISTRO;i++){
  37.     if(registro[i]){
  38.       free((char*)registro[i]->ip);
  39.         free((char*)registro[i]->fecha);
  40.           free((char*)registro[i]->recurso);
  41.             free((char*)registro[i]->ruta);
  42.     }
  43.     free(registro[i]);
  44.   }
  45.   free(registro);
  46. }
  47.  
  48.  
  49. void ordenar_archivo(const char* archivo,size_t memoria_disponible){
  50.   //Necesita la funcion de comparacion de strings.
  51.   //heap_t* heap = heap_crear((cmp_func_t)funcion_cmp_logs);
  52.   FILE* archivo_log = fopen(archivo,"r");
  53.   char* linea=NULL;
  54.   size_t CANTIDAD_LINEAS = 0;
  55.  
  56.   char line[SIZE];
  57.   size_t tam_line=0;
  58.   /*Cuento la cantidad de lineas y busco la linea maxima para definir
  59.   la cantidad de particiones a hacer y la cota de lineas para leer por particion.
  60.   */
  61.   while(fgets(line, sizeof(line), archivo_log) != NULL){
  62.       if(sizeof(linea)>tam_line) tam_line=(sizeof(line));
  63.       CANTIDAD_LINEAS++;
  64.   }
  65.   const size_t K_PARTICIONES = memoria_disponible/tam_line;
  66.   const size_t COTA_LINEAS = (CANTIDAD_LINEAS / K_PARTICIONES)+1;
  67.  
  68.   //Armo un array de punteros a las futuras particiones.
  69.   FILE *particiones[K_PARTICIONES];
  70.  
  71.   int contador_linea = 0; //esto es muy villero but it works dude
  72.  
  73.   fseek( archivo_log, 0, SEEK_SET ); //me paro al principio del archivo actual para volver a leerlo
  74.  
  75.  
  76.   //La papa. Aca arranco a meter la data en cada particion.
  77.   for (int i = 0; i < K_PARTICIONES; i++){
  78.     char filename[50];
  79.     sprintf(filename,"particion%d.txt",i);
  80.     particiones[i] = fopen(filename,"w");
  81.     FILE* archivo_actual = particiones[i];
  82.     size_t i = 0;
  83.  
  84.     char* linea_actual = NULL; size_t cap_archivo = 0;
  85.  
  86.     /*
  87.     Esto funciona parecido a la tabla del hash. La idea es tener un array temporal
  88.     de registros, donde cada indice van a ser las lineas que se van a escribir en la particion
  89.     actual. Entonces en cada indice hay un struct con la data necesaria de la linea.
  90.     */
  91.     linea_registro_t** registros = malloc(sizeof(linea_registro_t*)*COTA_LINEAS);
  92.  
  93.     //Inicializo cada campo del vector de registros.
  94.     for(int i=0;i<COTA_LINEAS;i++){
  95.       registros[i] = crear_registro();
  96.     }
  97.  
  98.     while(i < COTA_LINEAS && contador_linea < CANTIDAD_LINEAS){
  99.       getline(&linea_actual,&cap_archivo,archivo_log);
  100.       char** registro_actual = split(linea_actual,'\t');
  101.       //printf("%zu\n",strlen(registro_actual[0]));
  102.       //strcpy(registros[i]->ip,registro_actual[0]); //Tira invalid write, nose pq.
  103.       // strcpy(registros[i]->fecha,registro_actual[1]);
  104.       // strcpy(registros[i]->recurso,registro_actual[2]);
  105.       // strcpy(registros[i]->ruta,registro_actual[3]);
  106.  
  107.  
  108.       i++,contador_linea++;
  109.       free_strv(registro_actual);
  110.     }
  111.     registro_destruir(registros,COTA_LINEAS);
  112.     /*Despues de tener bien la linea en el vector la idea es
  113.     Hacer primero heapsort con la funcion cmp que hice, y despues
  114.     de hacerle heapsort a ese vector, escribirlo en las k particiones.*/
  115.     free(linea_actual);
  116.     fclose(archivo_actual);
  117.   }
  118.   fclose(archivo_log);
  119.  
  120. }
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127. int main(int argc, char* argv[]){
  128.  
  129.   const char* archivo_log = argv[1];
  130.   const size_t memoria = atoi(argv[2]);
  131.   if(memoria<=0){
  132.     fprintf(stderr,"Parametro memoria incorrecto");
  133.   }
  134.   ordenar_archivo(archivo_log,memoria);
  135.   return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement