- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- //Modela la estructura de una tabla de reservas
- typedef struct{
- int segmentos; // Numero de segmentos de las matrices de los ficheros f.txt y g.txt
- int ciclos; // Numero de ciclos de las matrices de los ficheros f.txt y g.txt
- int *tabla;
- } TablaReservas;
- int main(){
- char nom_fich1[] = "f.txt";
- char nom_fich2[] = "g.txt";
- TablaReservas tab_reserv1, tab_reserv2; // Tablas de reservas del problema
- int *vector11,*vector22,*vector12,*vector21; // Vectores de colisiones
- tab_reserv1.tabla = (int*)malloc(10*10*sizeof(int)); // Reservamos memoria para la tabla de reservas de "f.txt"
- tab_reserv2.tabla = (int*)malloc(10*10*sizeof(int)); // Reservamos memoria para la tabla de reservas de "g.txt"
- comprueba_ficheros();
- //Calculamos el numero de segmentos y ciclos de cada fichero
- tab_reserv1.segmentos = calcula_segmentos(nom_fich1); // Numero de segmentos de la tabla de reservas del fichero f.txt
- tab_reserv2.segmentos = calcula_segmentos(nom_fich2); // Numero de segmentos de la tabla de reservas del fichero g.txt
- tab_reserv1.ciclos = calcula_ciclos(nom_fich1); // Numero de ciclos de la tabla de reservas del fichero f.txt
- tab_reserv2.ciclos = calcula_ciclos(nom_fich2); // Numero de ciclos de la tabla de reservas del fichero g.txt
- //printf("Los segmentos de f.txt: %d\n",tab_reserv1.segmentos);
- //printf("Los ciclos de f.txt: %d\n",tab_reserv1.ciclos);
- //printf("Los segmentos de g.txt: %d\n",tab_reserv2.segmentos);
- //printf("Los ciclos de g.txt: %d\n",tab_reserv2.ciclos);
- extrae_fichero(tab_reserv1, "f.txt"); // Leemos el fichero "f.txt" y lo almacenamos en la matriz1
- extrae_fichero(tab_reserv2, "g.txt"); // Leemos el fichero "g.txt" y lo almacenamos en la matriz2
- //imprime_tabla_reserva(tab_reserv1);
- //imprime_tabla_reserva(tab_reserv2);
- return 0;
- }
- //Procedimiento que comprueba si los ficheros son validos.
- comprueba_ficheros()
- {
- FILE *fich1, *fich2;
- fich1 = fopen ("f.txt","r"); // Apertura de ficheros para lectura
- fich2 = fopen ("g.txt","r");
- if (fich1 == NULL){
- printf("\nEl fichero f.txt no es valido.\n");
- exit(-1);
- }
- if (fich2 == NULL){
- perror("\nEl fichero g.txt no es valido.\n"); // Si alguno de los dos ficheros es invalido,
- exit(-1); // salimos del programa.
- }
- printf("Los ficheros 'g.txt' y 'f.txt' son validos\n");
- fclose(fich1); // Cierre de ficheros
- fclose(fich2);
- }
- // Funcion que calcula el numero de segmentos de una tabla de reservas. Los segmentos coinciden
- // con el numero de filas de la tabla.
- int calcula_segmentos(char nom_fich[200])
- {
- FILE *fich;
- int total; // Contador de segmentos
- char cadena[50]; // Cadena auxiliar para ir sacando de fichero
- fich = fopen (nom_fich,"r");
- total = 0;
- while (!feof(fich)){ // Mientras que no encuentre caracter final de fichero...
- fgets(cadena,50, fich); // ...leemos una linea entera e
- total++; // incrementamos el numero de segmentos
- }
- fclose(fich);
- return(total - 1); // Retornamos el numero de segmentos de la tabla de reservas
- }
- // Funcion que calcula el numero de ciclos de una tabla de reservas. Los ciclos coinciden con
- // el numero de columnas de la tabla.
- int calcula_ciclos(char nom_fich[200])
- {
- FILE *fich;
- char cadena[50]; // Cadena auxiliar para ir sacando de fichero
- int total; // Contador de ciclos
- fich = fopen (nom_fich,"r");
- fgets(cadena,50, fich); // Leemos una linea entera y la metemos en cadena
- fclose(fich);
- total = (strlen(cadena) - 1); // El numero de ciclos sera la longitud de la cadena extraida.
- return(total); // Retornamos el numero de ciclos de la tabla de reservas
- }
- extrae_fichero(TablaReservas *t, char nom_fich[200])
- {
- FILE *fich;
- int i,j;
- char c;
- fich = fopen (nom_fich,"r");
- i = j = 0;
- while (!feof(fich)){ // Mientras no sea final de fichero...
- c = fgetc(fich); // ... lee caracter
- if (c != '\n'){
- t->tabla[i][j] = (int)c - 48; // Se resta 48 para pasar de chat a int
- j++;
- }else{
- i++;
- j = 0;
- }
- }
- fclose(fich);
- }
- imprime_tabla_reserva(TablaReservas *t)
- {
- int i, j;
- for (i = 0 ; i < t->segmentos ; i++){
- for (j = 0 ; j < t->ciclos ; j++)
- printf("%d",t->tabla[i][j]); // Escribimos el dato de la posicion i,j de la matriz
- printf("\n");
- }
- }