You are on page 1of 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. 2. 3. 4. Concepto de archivo en Fortran 90-95 y sus diferentes dispositivos. Los comandos bsicos del manejo y uso del Fortran 90-95. Ejemplos de casos especficos, problemas y posibles soluciones. 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 Open Close Read Write Rewind BackSpace Descripcin Apertura de un archivo de entrada y/o salida con numero de unidad especial Cierre de un archivo de entrada y/o salida con numero de unidad especial Lectura de datos de un archivo de entrada y/o salida con numero de unidad especial Escritura de un archivo de entrada y/o salida con numero de unidad especial Posiciona el control de acceso al inicio de un archivo. 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 0 5 6 * (asterisco) 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, /) ---

Descripcin Se predetermina como pantalla o como teclado Se predetermina como teclado. Se predetermina como pantalla. Siempre representa la pantalla y el teclado.

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 No existe registro precedente RESULTADO 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

You might also like