[13. Sentencia format ]  [Tutorial de Fortran]  [15. Arreglos en subprogramas ]

14. E/S de Archivos

Se han estado haciendo ejemplos donde la salida/entrada se ha realizado a los dispositivos estándares de entrada/salida. También es posible leer o escribir de archivos los cuales son guardados en algún dispositivo externo de almacenamiento, por lo general un disco (disco duro, floppy) o una cinta. En Fortran cada archivo esta asociado con un número de unidad, un entero entre 1 y 99. Algunos números están reservados: 5 es la entrada estándar, 6 es la salida estándar.

Abriendo y cerrando un archivo

Antes de que pueda usarse un archivo se requiere que sea abierto (open). El comando es
      open (lista_de_especificadores)
donde los especificadores más comunes son:
    [UNIT=]  u
    IOSTAT=  ios
    ERR=     err
    FILE=    nomb_arch
    STATUS=  sta
    ACCESS=  acc
    FORM=    frm
    RECL=    rl
El número de unidad u es un número en el rango de 9-99 para algún archivo, el programador lo escoge debiendo ser un número único.

ios es el identificador del estado de la E/S y debe ser una variable entera. El valor que regresa ios es cero si la sentencia fue exitosa y sino, regresa un valor diferente de cero.

err es una etiqueta a la cual el programa saltará si hay un error.

nomb_arch es una cadena de caracteres que contiene el nombre del archivo.

sta es una cadena de caracteres que tiene que ser NEW, OLD o SCRATCH. Esta muestra el estatus del archivo. Un archivo scratch es aquel que es creado y borrado cuando el archivo es cerrado (o el programa termina).

acc deberá ser SEQUENTIAL o DIRECT. El valor predefinido es SEQUENTIAL.

frm deberá ser FORMATTED o UNFORMATTED. El valor predefinido es UNFORMATTED.

rl indica la longitud de cada registro en un archivo de acceso directo.

Para más detalles en los especificadores, se recomienda que se revise un buen libro de Fortran 77.

Una vez que un archivo ha sido abierto, se puede acceder con sentencias de lectura y escritura. Cuando se manipula un archivo y se termina de usar, deberá ser cerrado usando la sentencia.

      close ([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])
donde, los parámetros en bracket [] son opcionales

Complemento de Read and write

El único cambio necesario de los ejemplos previos de las sentencias read/write, es que el número de unidad debe ser indicado. Pero se pueden incluir especificadores adicionales. Se muestra como:
      read ([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
      write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
donde la mayoría de los especificadores han sido descritos anteriormente. El especificador END=s define a que sentencia saltará el programa si se alcanza el fin del archivo (eof).

Ejemplo

Se da un archivo de datos con las coordenadas xyz de un montón de puntos. El número de puntos es dado en la primera línea. El nombre del archivo de datos es puntos.dat. El formato para cada coordenada es de la forma F10.4 Se muestra un programa que lee los datos y los pone en tres arreglos x, y, z.
      program entdat
c
c  Este programa lee n puntos desde un archivo de datos y los guarda en
c  3 arreglos x, y, z.
c
      integer nmax, u
      parameter (nmax=1000, u=20)
      real x(nmax), y(nmax), z(nmax)

c  Abrir el archivo de datos
      open (u, FILE='puntos.dat', STATUS='OLD')

c  Leer el número de puntos
      read(u,*) n
      if (n.GT.nmax) then
         write(*,*) 'Error: n = ', n, 'es más largo que nmax =', nmax
         goto 9999
      endif

c  Ciclo para recuperar los datos 
      do 10 i= 1, n
         read(u,100) x(i), y(i), z(i)
   10 enddo
  100 format (3(F10.4))

c  Cerrar el archivo
      close (u)

c  Ahora se procesarán los datos
c  ...

 9999 stop
      end

Ejercicios

Ejercicio A
Modificar el ejemplo anterior para que el programa escriba un mensaje de error descriptivo y se detenga, si hay un error en la entrada del archivo de datos.

Ejercicio B
Cambia el programa del Ejercicio A para que abra un nuevo archivo norms.dat para escribir y mandar la Norma-L1 y la Norma-L2 de cada punto (x,y,z), puedes consultar en Mathworld esas definiciones. La primera línea deberá tener el número de puntos n, y después cada línea contendrá dos numeros de punto flotante, cada uno impreso en un campo con 12 caracteres de ancho.


 [13. Sentencia format ]  [Tutorial de Fortran]  [15. Arreglos en subprogramas ]