Está en la página 1de 13

CAPITULO IX

MANEJO DE ARCHIVOS EN FORTRAN 90-95


Resultados del aprendizaje.

El alumno podr manejar archivos con Fortran 90-95.


Conocer el uso de la impresora y sus problemas.
Manejar los comandos propios de manejo y uso de archivos.
Podr crear sus respaldos de datos en medios magnticos.

Contenido:

1. Concepto de archivo en Fortran 90-95 y sus diferentes dispositivos.


2. Los comandos bsicos del manejo y uso del Fortran 90-95.
3. Ejemplos de casos especficos, problemas y posibles soluciones.
4. Evidencias para el aprendizaje.

Pregunta Gua

Es la impresora considerada en Fortran 90-95 un archivo?

131
Sesin Presencial:

Introduccin a archivos.
Fundamentos En el sistema de entradas y salidas, los datos son almacenados y
transferidos a travs de archivos. Todas las fuentes y destinos de datos son
considerados como archivos. La pantalla, el teclado y la impresora son archivos
externos, as como archivos almacenados en disco. Cualquier archivo es
asociado con un manejador lgico.
El manejador lgico es especificado en el parmetro conocido como unidad
lgica UNIT.
Para el manejo de archivos existen seis comandos bsicos a saber:

Comando Descripcin
Open Apertura de un archivo de entrada y/o salida con numero de
unidad especial
Close Cierre de un archivo de entrada y/o salida con numero de
unidad especial
Read Lectura de datos de un archivo de entrada y/o salida con
numero de unidad especial
Write Escritura de un archivo de entrada y/o salida con numero de
unidad especial
Rewind Posiciona el control de acceso al inicio de un archivo.
BackSpace Retrocede el control de acceso al registro anterior.

UNIT.- Es la forma de especificar el nmero de unidad lgica asignada a un


archivo y que se representa con un nmero entero, de tal forma que aunque
tenemos la alternativa de designarlos, ya existen cuatro unidades lgicas
predeterminadas a saber:

Ud Lgica Descripcin
0 Se predetermina como pantalla o como teclado
5 Se predetermina como teclado.
6 Se predetermina como pantalla.
* (asterisco) Siempre representa la pantalla y el teclado.

Ejemplo:
--
--
WRITE (0,1)
1 FORMAT (DAME UN VALOR DE X)
READ (5,2) X
2 FORMAT (F5.1)
WRITE (6,3) X
3 FORMAT (I5, F5.1, /)
--
--

132
Descripcin de comandos bsicos.

Comando de apertura OPEN


(Asocia un nmero de unidad con un archivo externo.)

Sintaxis
OPEN([UNIT=] unidad [, ACCESS=acceso] [ACTION=accin]
[, BLANK= blancos] [, BLOCKSIZE= Tamao del bloque]
[, CARRIAGECONTROL= control de carro] [, DELIM= lmite]
[, ERR=error] [, FILE= Archivo] [, FORM= forma]
[, IOFOCUS= Punto Lgico Entrada/Salida] [, IOSTAT= Edo de entrada/Salida]
[, PAD=Blancos]
[, POSITION= posicin] [, RECL= rellamada] [, SHARE= Compartido]
[, STATUS= Estado])

Si UNIT= es omitida, unitspec debe de ser el primer parmetro. En otro caso los
parmetros pueden aparecer en cualquier orden.

unit
Entero que especifica el nmero de la unidad externa. Debe ser mayor que 0
.
access
Modo de acceso para el archivo. Uno de APPEND, DIRECT,
SEQUENTIAL (Por Omisin, en forma automtica).

action
Que accin se pretende realizar dentro del archivo. Puede ser:
READ (el proceso es solo leer el archivo),
WRITE (se pretende solo escribir en el archivo), o
READWRITE (se pretende realizar las dos acciones leer y escribir).
Si action es omitida, se trata primero con READWRITE, Si esta falla, se trata
de usar READ, y en el ltimo caso se trata de usar WRITE.

blanks
Character*(*). Controla la interpretacin de los blancos en I/O formateada.

blocksize
Tamao del buffer interno de la unidad en bytes.

carriage control
Indica como se debe interpretar el primer carcter de los registros formateados.

delim
Forma de delimitar los registros delimitados. Puede ser APOSTROFES,
CUOTA, o NADA (Automticamente)

133
err
Etiqueta de una instruccin ejecutable en el mismo programa.

file
Nombre del archivo que se desea abrir. El estatuto OPEN con espacios en
blanco como nombre de archivo, propicia a que se abran varios archivos al
mismo tiempo.

form
Determina la forma de apertura puede ser FORMATEADO SIN FORMATO,
o BINARIO.
Para acceso secuencial en forma automtica es FORMATED; para acceso
directo forma automtica es UNFORMATED.

Iofocus
Valor lgico para indicar si una ventana de una aplicacin est activa es :
QuickWin ( Ventana Rpida),

iostat
(Salida) Entero que define si existe o no errores en la instruccin. Cero no
ocurri error, un valor negativo si se encontr el fin del archivo o el nmero de
mensaje de error.

pad
Especificacin de si los registros formateados son o no rellenados con blancos al
momento de la lectura. Valores vlidos son YES( en forma automtica ) o NO.

position
Indica la posicin de inicio dentro del archivo. Puede ser ASIS (En forma
automtica), REWIND, o APPEND. Si es REWIND, un archivo existente se
posiciona en el principio. Si es APPEND, en un archivo existente el apuntador
de registro se mueve hasta el final. Si es ASIS, la posicin en un archivo
conectado no cambia, mientras que en un archivo desconectado la posicin ser
hasta el principio.

recl
Tamao del registro en bytes para archivos de acceso directo, o el mximo
tamao para archivos secuenciales. Este parmetro es necesario para archivos
de acceso directo.

share
Cadena que define como se comparte un archivo.
DENYRW modo Deny-Read/write. Ningn otro proceso puede abrir el archivo.
DENYWR modo Deny-write. Ningn otro proceso puede escribir en el archivo.
DENYRD modo Deny-Read. Ningn otro proceso puede abrir el archivo para
leerlo.

134
DENYNONE modo Deny-None (en forma automtica). Cualquier proceso
puede abrir el archivo.

status
Cadena que describe la naturaleza del archivo a ser abierto:
OLD El archivo debe existir. Si existe, se abre. Si no existe, ocurre un error de
entrada salida, que dice Archivo In-existente.
NEW El archivo no debe existir. Si no existe el archivo es creado. Si existe,
entonces genera un error que dice Archivo ya existente .

SCRATCH Si se omite el parmetro file al abrir el archivo, el valor del estado


del archivo es SCRATCH. Los archivos Scratch son temporales ( Voltiles).
Estos archivos son borrados cuando la unidad se cierra o termina el programa.

REPLACE El archivo abierto reemplaza a uno del mismo nombre. Si no existe


un archivo con el mismo nombre, este se crear.
UNKNOWN (en forma automtica ) Primero se trata de abrir un archivo
existente (status igual a OLD), y despus con el status NEW. Si el archivo
existe, se abre; si no existe lo crea.

Comando de cierre CLOSE


(Desconecta cierra una unidad archivo especfico.)

Sintaxis
CLOSE([UNIT=]unitspec [, ERR=errlabel] [, IOSTAT=iostat] [, STATUS=status])

unitspec
Especfica una unidad externa (Entrada) Integer. No sucede ningn error si la
unidad se encuentra cerrada, pero si esta abierta, genera un de error.

enlabel
La etiqueta de una instruccin ejecutable en el mismo cdigo del programa o
modulo. Si se especifica se transfiere el control a esa instruccin.

Iostat (Salida) de tipo Entero. Esto si no ocurre error; en otro caso, el nmero
del error de corrida.

status
Expresin (Entrada) tipo Character*(*). que evala a KEEP (Guardar)
DELETE ( Borrar). El predeterminado es KEEP.

Explicacin

No es necesario cerrar explcitamente archivos. Terminaciones normales de un


programa cierra cada archivo con sus valores predeterminados.

135
Cerrar la unidad 0 automticamente reconecta la unidad 0 con el teclado y la
pantalla. Cerrar las unidades 5 y 6 automticamente de reconectan con el
teclado y la pantalla, respectivamente. No se puede cerrar la unidad asterisco
(*).

Ejemplo:
El siguiente ejemplo escribe en la unidad preconectada 6, luego se
reconecta con un archivo externo COSENOS y se escribe en l, y
finalmente se reconecta a la pantalla.

PROGRAM ARCHIVOS
-----------------------
-----------------------
REAL :: TETA, ANGULO
ESCRIBE EN LA PANTALLA (UNIDAD PRECONECTADA 6).
WRITE(6, (ESTA ES LA UNIDAD 6))
!USO DE LA INSTRUCCIN OPEN PARA CONECTAR LA UNIDAD 6 A UN ARCHIVO
!EXTERNO LLAMADO SENOS
OPEN (UNIT= 6, FILE= SENOS, STATUS= NEW)
DO TETA=0.1, 6.3, 0.1
ANGULO= COS(TETA)
!ESCRIBIR EN EL ARCHIVO SENOS.
WRITE (6, 100) TETA, ANGULO
100 FORMAT (F3.1, F5.2)
END DO
!CERRARLO.
CLOSE (6)
!RECONECTAR UNIDAD 6 CON LA PANTALLA, Y ESCRIBIR EN ELLA.
WRITE (6, (SENOS COMPLETOS))
END PROGRAM ARCHIVOS

Comando de lectura READ


(Transfiere datos desde un archivo especfico.)

Sintaxis
READ {{fmt, nml}([UNIT=]unidad [. {[FMT=]FMT[NML=]nml}]
[, ADVANCE= avance] [, END=fin] [,EOR=error] [,ERR=error]
[, IOSTAT=estado de la ud de entrada/salida] [, REC= registro]
[, SIZE=size])}iolist

unit Especificacin de unidad

fmt Definicin del formato. Puede ser el nmero de etiqueta de una instruccin
FORMAT: una expresin de carcter; asterisco (*) para lectura directa*) unit (El
Teclado).

nml Especificacin de una lista de nombres. Si se especifica, iolist y fmt deben


omitirse.

136
advance
Indica si el apuntador de registro avanza o no. Los valores posibles son YES
(Por omisin) NO.

End Etiqueta de alguna instruccin a ejecutar para cuando se llega al fin del
Archivo.

Eor Etiqueta de una instruccin ejecutable cuando suceda el fin de algn


Registro.

Err Etiqueta de alguna instruccin a ejecutar para cuando suceda algn error
De entrada y/ salida.

iostat
Valor del error encontrado (Salida).
A) Cero no existe error,
B) -1 se encontr el fin del archivo
C) # nmero del mensaje de error.
rec
Nmero de registro solo para archivos de acceso directo. El primer registro en el
archivo es el nmero 1.

Size Nmero de caracteres transferidos.

Iolist Una o mas entidades sobre las que se transferirn los datos del archivo.

Ejemplo :

DIMENSION IA(10,20)
!LEER LOS VALORES DENTRO DE UN ARREGLO.
!LA LECTURA EN EL ARREGLO ESTA ITERADA DENTRO DE UN ESTATUTO DO Y ES UNA
!LISTA DE ENTRADA CON FORMATO DE 8 COLUMNAS DE 5 DGITOS C/U.
READ (6, 990) N1, N2, ((IA(I, J), J=1, N2), I=1, N1)
990 FORMAT (2I5, / , (8I5))
!LECTURA CON LISTA-DIRECTA SIN USAR UN FORMATO ESPECFICO
REAL X,Y
INTEGER I, J
READ(*,*) X, Y, I, J

Comado de escritura WRITE


(Transfiere datos de una lista a un archivo)
Sintaxis
WRITE([UNIT=]unidad [. {[FMT=]FMT[NML=]nml}]
[, ADVANCE= avance] [,ERR=error] [, IOSTAT=estado de entrada/salida]
[, REC= registro])iolist
La explicacin es similar a la de lectura (READ).

137
Iolist Esta lista es un conjunto de expresiones separadas por comas que
proporcionaran los valores a transferir al archivo

REWIND Comando de re embobinado posicionamiento al primer registro,


Posiciona en el primer registro de un archivo.
Sintaxis
REWIND {unit | ([UNIT=]unidad [, ERR=error] [, IOSTAT=error estado de
entrada/salida])}

Unit Especifica la unidad externa (Entrada) de tipo Entero. Si la unidad no est


abierta, REWIND no tiene ningn efecto.

Err Etiqueta dentro del programa para ejecutar una instruccin cuando suceda
algn error.

Iostat (Salida) Integer. Cero si la reposicin sucede; en otro caso, el nmero del
error.
Ejemplo
WRITE (7, (500)) matricula
REWIND (7)
READ (7, (500)) matricula

Comando de retroceso BACKSPACE


( Posiciona en el principio de un registro dentro de un archivo.)

Sintaxis
BACKSPACE {unitspec([UNIT=]unidadespecifica [, ERR=etiqueta de error]
[, IOSTAT=error])}
La explicacin de los parmetros es idntica a los del OPEN.
La instruccin BACKSPACE regresa un registro en el archivo, excepto en los
La primera posicin de un registro, exceptuando los casos siguientes:

CASO RESULTADO
No existe registro precedente La posicin del archivo no ser
cambiada
La posicin del archivo est en la El archivo es posicionado en el
mitad de un registro principio de este registro.
El registro precedente es el fin del El archivo es posicionado
archivo. inmediatamente antes del fin de
archivo.

138
Ejemplo
BACKSPACE 8
BACKSPACE (8)
BACKSPACE unidad1
BACKSPACE (UNIT=unitdad1, ERR= 500, IOSTAT=error)

Enviar datos a la impresora

Para salidas a la impresora abra un archivo a la palabra reservada del sistema


operativo Lpt1 P r n
Ejemplo: OPEN (2, FILE= prn)
WRITE(2,*) Esto se obtiene en la impresora
PRINT*,Esto sale en la pantalla

Ntese WRITE debe de ser usado en conjunto con una unidad numrica. Este
es un estatuto mas general que PRINT. El PRINT es un comando simple, a
diferencia del WRITE que puede asignar un formato.

Si como decimos en el captulo anterior (Pg. 121), que los dispositivos de


entrada, salida y/o almacenamiento, se consideran archivos. Entonces la
impresora es un dispositivo Fsico por lo tanto debemos identificarla como tal;
con una direccin lgica la cual se encuentra asignada.

Con frecuencia vemos conflictos a la hora de imprimir en Fortran 90-95, pues las
direcciones lgicas no corresponden a la fsicas y esto, es debido porque al
instalar el sistema operativo en forma automtica; generar direcciones lgicas
para evitar conflictos de requerimientos de memoria, de acuerdo a las
caractersticas con las que cuente cada equipo de cmputo y tambin se efecta
en forma distinta segn el Windows tales como el 95, 95 Vs1, 98, 98 Se, 2000,
2000 Nt, Me, Xp, etc. Para solucionar tanta diferencia tendramos que acceder al
estado real de instalacin fsico/lgica a travs del rea avanzada de instalacin
personalizada, lo cual implica apoyo de un experto en computacin.

Tal es el caso de un laboratorio de computacin en donde el encargado del


laboratorio de computacin asigna prioridades y accesos a los diferentes
dispositivos ya sea para proteger y/o administrar mejor sus recursos y accesos
de sus usuarios.

Hay ocasiones en que el equipo cmputo del tipo personal, las direcciones
Tanto lgicas como fsicas, correspondan las solicitadas en el lenguaje Fortran
90-95 como es el caso de ,muchos equipos con Windows 95, 98 se, y Xp.

NOTA Para Todo comando Open debe haber un comando Close al finalizar la
accin. (Ver programas resueltos desde la pgina 129 a la 132 )

139
Ejemplos

Program impresora

--
--
OPEN (UNIT = 15, FILE = LPT1)
WRITE (15,500) MATRICULA, NOMBRE, PROMEDIO
500 FORMAT (T10, I8, 5X, A30, 5X, F7.2,/)
--
CLOSE

Otra forma:
WRITE (LPT1 , 500) MATRICULA, NOMBRE, PROMEDIO
Tambin:
OPEN (UNIT = 6, FILE = PRN)
WRITE (7,500) MATRICULA, NOMBRE, PROMEDIO

WRITE (PRN,500) MATRICULA, NOMBRE, PROMEDIO

Nota:
Para la grabacin en algn medio magntico, si se desea grabar en puerto USB,
disco flexible, rgido, etc., es necesario conocer el nmero fsico y/o lgico
asignado, esto lo puede conocer por medio del instalador avanzado que se
encuentra dentro del sistema operativo instalado en su equipo, donde se
localizan las direcciones del mismo.

Ejemplo para la grabacin:


--
--
OPEN (UNIT=1, FILE= ALUMNOS, STATUS = NEW, ACTION = WRITE, IOSTAT=EROR)
ABRIR: IF (STAUS = = 0) THEN
WRITE (1, (A20)) NOMBRE
--
ELSE
WRITE (*,*) ERROR= ,ERROR,AL ABRIR ARCHIVO,/)
END IF ABRIR_SI
CLOSE (UNIT=1)
END PROGRAM LISTA_ALUMNOS

En este ejemplo podemos apreciar:

Que se abre un archivo con unidad lgica 1 y es de salida.


Que el archivo es de nueva creacin NEW.
Que si existe alguna falla al intentar crearlo le asignar el # de error en la
variable de tipo entero, error.
Que podemos detectar el error y desplegarlo para su consulta posterior.
Que el archivo se cierra al trmino del programa, con el comando Close.

140
NOTA:
Existe una tabla de errores que se otorga en el manual en la compra del paquete Forran 90-95.

Lectura desde archivos de texto.


Cuando se tiene que introducir gran cantidad de datos es preferible utilizar como
entrada un archivo de texto, Un archivo de texto, llamado datos .txt, tiene los
siguientes nmeros: 3, 4, 5. Para leerlos se utiliza el siguiente programa:

Program Lectura
OPEN(1,file=alumnos.txt)
READ(1,*) matr, nom, esp
PRINT*, matr, nom, esp
END Program Lectura

**
La instruccin OPEN conecta la unidad nmero uno con el archivo externo
datos. txt.

Lectura de una cantidad desconocida de datos.

El DO implicado junto con el especificado IOSTAT en READ provee una forma


neta de lectura de una cantidad desconocida de datos dentro de un archivo,
donde solo la medida mxima del archivo es dada.
Ejemplo

Program NumDesc
INTEGER, PARAMETER :: MAX=100
REAL, DIMENSION(MAX)::X
OPEN(1, FILE= DATA)
READ (1, *, IOSTAT=10) (X(1), I=1, MAX)
IF (10 < 0 ) THEN
N=I+1
ELSE
N= MAX
END IF
WRITE(*,*) (X(1), I=1, N)
End Program NumDesc

Los datos deben de ser arrancados en cualquier formato del archivo insertado.
Ntese que I es una unidad ms grande que el nmero de valores ledos: este
es incrementado en el CICLO implicado antes del fin del archivo la condicin de
archivo es fcilmente detectada.

Ntese tambin que:


Una forma normal de salida de el CICLO implica su valor podra ser MAX+1.

EJEMPLO DE OTRO PROGRAMA CON USO DE ARCHIVOS

141
Elaborar un programa que calcule la curva de mnimos cuadrados y su
intercepcin con el eje de las Equis.
PROGRAM MINIMOS_CUADRADOS
! COMENTARIOS
IMPLICIT NONE UNIDAD LOGICA DONDE SE ENCUENTRE EL ARCHIVO
INTEGER PARAMETER :: UL = 18
CHARACTER ( LEN = 24 ) :: NOMBRE_ARCHIVO
INTEGER :: ERROR
INTEGER :: N = 0
REAL :: MEDIA, SX, SX2, SXY, SY
REAL :: X, Y, MX, MY, INT_Y
WRITE ( * , 1000 ) DIRECCION A DONDE INDICA COMO VAMOS A ESCRIBIR
1000 FORMAT (X, ESTE ES..., / , X , DAME EL CONJUNTO..., /, X ,DE UN ARCHIVO QUE
& CONTIENE ( X, Y ), / )
READ ( * , (A) ) NOMBRE_ARCHIVO ABORTA EL ARCHIVO POR SER =0
OPEN ( UNIT_UL, FILE NOM_ARCHIVO, STATUS = OLD , ACTION = READ IOSTAT = &
ERROR )
REVISAR ERROR: IF ( ERROR = 0 ) THEN
WRITE ( * , 1020 ) NOMBRE_ARCHIVO
1020 FORMAT ( X, ERROR EN ARCHIVO, A,NO EXISTE )
ELSE
ALFABETICO: DO
READ ( UL, *, IOSTATE = ERROR ) X, Y
IF ( ERROR / = 0 ) EXIT
N=N+1
SX = SX + X
SY = SY + Y
SXY = SXY + X * Y
SX2 = SX2 + X * * 2
END DO ALFABETICO
MX = SX / REAL ( N ) SE MARCA REAL POR QUE N ESTA DECLARADA ENTERA
MY = SY / REAL ( N )
MEDIA = ( SXY SX * MY ) / ( SX2 SX * MX ) FORMULA CODIFICADA
INT_Y = MY_MEDIA * MX
WRITE ( * , 1030 ) MEDIA, INT_Y, N
1030 FORMAT ( 0, COEFICIENTES DE REGRESION DE LA RECTA DE MINIMOS
CUADRADOS, / , X , MEDIA =, F12.3, /, X, NUMEROS DE PUNTOS =, I12 )
CLOSE ( UNIT = UL )
END IF REVISA ERROR
END PROGRAM MINIMOS CUADRADOS

142
Evidencia integradora para el aprendizaje:

9.1.- Qu es un archivo?
9.2.- En Fortran 90-95 Cmo se describen sus dispositivos de entrada, salida
y/o almacenamiento?
9.3.- Qu es una unidad lgica?
9.4.- Cules son los comandos bsicos para el manejo de archivos en Fortran?
9.5.- Describa detenidamente el comando de apertura Open para Fortran
9.6.- Describa detenidamente el comando de cierre Close para Fortran 90-95.
9.7.- Describa detenidamente el comando de lectura Read para Fortran 90-95.
9.8.- Describa detenidamente el comando de escritura Write para Fortran
9.9.- Describa detenidamente el comando de reinicio Rewind para Fortran
9.10.- Describa detenidamente el comando de retroceso BackSpace de
Fortran 90-95
9.11.- Elabore un programa con todos y cada uno de los pasos sugeridos para
una programacin exitosa. Que De acuerdo con el problema Archivo de
Alumnos descrito en los ejercicios de los captulos anteriores, con Promedio,
rediselo de tal forma que se cree un archivo en disco.

143

También podría gustarte