program inputOutputArrays

  real, dimension(:), allocatable :: array
  integer(kind=2), parameter      :: unit=10
  integer                         :: nrFiles,nrColumns
  
  
  ! Accedo al primer archivo de lectura
  call readHeadersFromFile(10,"./inputArrays.dat",nrFiles,nrColumns)
  
  ! Abro un arhivo nuevo para escribir e otra unidad (11)
  open(11,file="./outputArrays.dat")
  
  ! Sabiendo la cantidad de elementos de c/fila de "inputArrays.dat" inicializo
  ! a dimension del array que va a contener los eementos de c/fila
  allocate(array(nrColumns))
  
  ! Leo en array y voy escribiendo a "outputArray.dat" y en pantalla
  print*,"columnas ",nrColumns
  
  do i=1,nrFiles
     read(10,*) (array(j), j=1,nrColumns)
     ! Imprimo a un archivo y a pantalla con 10 caracteres (INCLUIDO EL PTO. !) y 3 decimales
     write(11,'(3f8.3)') array
     write(*, '(3f8.3)') array     
  end do
  
  ! Cierro los archivos y el array!!
  close(10)
  close(11)
  deallocate(array)
  
  ! Si quiero acceder ahora a un archivo similar pero con una cantidad distinta de filas y columnas
  ! repito el procedimiento, lamando a la subrutina on os argumentos pertinentes, haciendo un nuevo 
  ! allocate del mismo array con su nueva dimension, y cerrando todo cuando corresponda. 
  
  
  
  contains
  
  subroutine readHeadersFromFile(unit,inputFileName,nrFiles,nrColumns)
     
     !------ DECLARACIONES -----------------
     ! Los argumentos de entrada son la unidad de lectura, e nombre del archivo
     ! Como argumentos de salida, tengo el numero de filas a leer (nrFiles)y la 
     ! cantidad de elementos por fila (rColumns) separados por un espacio.
     integer,           intent(in) :: unit
     character(len=50), intent(in) :: inputFileName
     integer,           intent(out):: nrFiles,nrColumns
    
     ! aux es solo para absorber los comentarios que no me interesan
     !,en caso de necesitarlos para escribiros en alguna salida, agrego argumentos de salida
     character(len=50) :: aux
     
     
     open(unit,file=inputFileName)
     read(unit,*) aux
     read(unit,*) aux
     read(unit,'(I1)') nrFiles
     read(unit,*) aux
     read(unit,'(I1)')  nrColumns 
     
  end subroutine readHeadersFromFile

end program inputOutputArrays