/*Archivo: 
  Descripcion: 
  Autores: 
  Fecha:
*/

#include <stdio.h>
#include <stdlib.h>

//Declaracion de las constantes para determinar el tamanio de la matriz
#define MAXCOLUMNAS  10
#define MAXRENGLONES 10

//Variables locales para definir el tamanio real de la matriz
int NumReng =0;
int NumCol =0; 


void LimpiarPantalla();
FILE *AbrirArchivo( char ruta_nombre[], char modo_apertura[] );
void InicializaMatriz( int Matriz [MAXRENGLONES][MAXCOLUMNAS], int tamReng, int tamCol);
void  SeleccionArchivo( FILE *Arch, int Matriz [MAXRENGLONES][MAXCOLUMNAS] );
void ImprimirMatriz( int Matriz [MAXRENGLONES][MAXCOLUMNAS], int tamReng, int tamCol);


int main()
{
   int opcion=0;
   FILE *arch;
   char ruta_nombre[200]; 
   
   int Matriz[MAXRENGLONES][MAXRENGLONES];
   

     
   do{
      LimpiarPantalla();
      printf("\n\tEscribe la ruta del archivo \n\tFORMATO:C:\\nombre.txt\n\t");
      fflush(stdin);
      gets(ruta_nombre);   
      arch= AbrirArchivo( ruta_nombre, "r+");
   }while(arch == NULL);

  //inicializa toda la matriz con ceros
  InicializaMatriz( Matriz , MAXRENGLONES, MAXCOLUMNAS);   

  //Modulo que copia de un archivo la informacion a una matriz
  SeleccionArchivo(arch, Matriz);
  
   //Imprimir matriz para ver que si se obtiene del archivo
   ImprimirMatriz( Matriz , NumReng, NumCol);
   
   getch();   
      return( 0 ); 
}

/** 
*Descripcion: 
*Entrada: 
*Salida: 
**/
void  SeleccionArchivo( FILE *Arch, int Matriz [MAXRENGLONES][MAXCOLUMNAS] )
{
     
   /*Declaración de variables locales*/
  int contReng, contCol; //indices para acceder al contenido de la matriz
  char carac = '\0';

  //Primero los se leen los dos valores 
  //NOTA: NumReng y NumCol son variables Globales
  //el primero es el numero de renglones de la matriz
  fscanf(Arch, "%d", &NumReng); //Se lee un entero
  //El segundo es el numero de columnas de la matriz
  fscanf(Arch, "%d", &NumCol); //Se lee un entero
  
  printf("\n\t Dimensiones de la matriz: \n \tRenglones: %d \n\t Columnas;: %d  \n\n", NumReng, NumCol);
  
  //Lectura del contenido de la matriz de acuerdo a las dimensiones previamente definidas
  //El primer for es para recorrer los renglones 
  for(contReng =0; contReng<NumReng; contReng++ )
  {
         //El segundo for es para recorrer las columnas
         for(contCol =0; contCol<NumCol; contCol++ )
         {
             //Se lee el caracter del archivo.
             carac = fgetc(Arch);

             //Si el 0 ó 1 se guarda en la matriz
              if(carac == '0' || carac =='1')
              {
                      //utilizando ascii se tiene que el 0 es 40 y el 1 es 49
                      Matriz[contReng][contCol] = carac - 48 ;
              }
              //Si es fin de linea o enter, no debe de contarse, por eso mismo se decrementa el contador
              if(carac == '\n')
              {
                contCol --;         
              }
         }
  }
}



/** 
*Descripcion: 
*Entrada: 
*Salida: 
**/
FILE *AbrirArchivo( char ruta_nombre[], char modo_apertura[] )
{
   FILE *arch;
   
   arch=fopen(ruta_nombre,modo_apertura);
   
   if(arch==NULL)
   {
                 printf("\n\tERROR AL ABRIR EL ARCHIVO %s", ruta_nombre);
                 printf("\n\tVerifique que la ruta, nombre y extension sean correctos\n"); 
                 getch();
   }
   else
   {
                 printf("\n\tTu archivo se abrio con exito");
                 getch();
   }
   return (arch);
}

/** 
*Descripcion: Limpia Pantalla
*Entrada: datos en pantalla
*Salida: pantalla limpia
**/
void LimpiarPantalla()
{    
     system("cls");//Comando para limpiar pantalla
}


/** 
*Descripcion: Se pasa como parámetro una matriz, el numero de renglones 
              y de columnas, para recorrer la matriz se utiliza dos ciclos
              for, y asi inicializar en cero la matriz.
* Entrada : La matriz, el número de renglones y columnas.
* Salida : Por referencia la matriz en ceros
**/
void InicializaMatriz( int Matriz [MAXRENGLONES][MAXCOLUMNAS], int tamReng, int tamCol)
{
  /*Declaración de variables locales*/
  int contReng, contCol; //indices para acceder al contenido de la matriz
  
  printf(" \n\n\t Inicio del Procedimiento InicializaMatriz \n");
      
  //El primer for es para recorrer los renglones 
  for(contReng =0; contReng<tamReng; contReng++ )
  {
         //El segundo for es para recorrer las columnas
         for(contCol =0; contCol<tamCol; contCol++ )
         {
             //Se accede al contenido para colocar el valor 0
             Matriz[contReng][contCol] = 0;
         }
  }
  
}

/** 
*Descripcion: Se encarga de enviar a apantalla el contenido de la matriz en 
*              un formato adecuado. 
* Entrada : La matriz, el número de renglones y columnas.
* Salida : Ninguno.
**/
void ImprimirMatriz( int Matriz [MAXRENGLONES][MAXCOLUMNAS], int tamReng, int tamCol)
{
  /*Declaración de variables locales*/
  int contReng, contCol; //indices para acceder al contenido de la matriz 
  
  printf(" \n\n\t Inicio del Procedimiento ImprimirMatriz \n");
  //Se manda a imprimir el contenido de la matriz
  printf(" \n\n El contenido de la matriz es el siguiente: \n");   
  
 //El primer for es para recorrer los englones 
  for(  contReng=0;   contReng< tamReng  ;     contReng++ )
  {
         printf("\n\t [ ");
         
         //El segundo for es para recorrer las columnas
         for(  contCol = 0  ;  contCol < tamCol ; contCol++   )
         {
              //se manda a impirmir accediendo al renglon y columna dado
              printf("%d|", Matriz[contReng][contCol]);

         }
         printf(" ] ");
  }         
}

  
  
