ESTRUCTURA DE UN FICHERO
-Un fichero es una colección de datos organizados de alguna manera y
almacenados generalmente en disco o cinta.
-Un fichero está formado por registros y estos constan de campos que
pueden ser numéricos o de caracteres.
-Los ficheros formateados pueden ser editados, imprimirse o visualizarse
mientras que los ficheros no formateados no pueden hacer esas acciones.
Aunque la lectura y la escritura son más rápidas y ocupan poca memoria.
ORGANIZACION DE FICHEROS
-Se consideran dos tipos de acceso a los registros de un fichero que
son los siguientes:
-Acceso Secuencial.
-Acceso Directo.
-El acceso Secuencial implica el acceso a un fichero según el orden de
almacenamiento de sus registros, uno a uno.
-El acceso Directo implica situarse en un registro determinado sin que
ello implique la consulta de los registros precedentes.
-La Organización de un fichero define la forma en que los registros se
disponen sobre el soporte de almacenamiento:
-Organización Secuencial.
-Organización Directa.
-Organización Indexada.
-Un fichero con organización Secuencial es una sucesión de registros
almacenados consecutivamente sobre un soporte externo de tal modo que
para acceder al registro n, necesariamente hay que pasar por los n-1
registros precedentes.
-Un fichero con organización Directa exige soporte direccionable. Cada
posición se localiza por su dirección absoluta, que en el caso del
disco suele venir definida por número de pista y de sector.
-El lenguaje Fortran no es muy fuerte es la manipulación de archivos
aunque tiene capacidad para manipularlos.
-Los archivos suelen ser pequeños y la información a tratar suele estar
en sentencias DATA.
APERTURA DE UN FICHERO. SENTENCIA "OPEN".
-Esta sentencia es la encargada de la apertura de un fichero, conectando
un fichero a un número de Unidad, de forma que para referirse después
al fichero se hará con el número de Unidad establecido en la apertura.
-Cuando se quiere crear un fichero en un programa se utilizará la
sentencia OPEN para que quede en una Unidad.
-La sentencia OPEN también es usada para declarar las propiedades del
fichero, si es Secuencial o Directo, si es Formateado o no Formateado
y otras propiedades.
-La sintaxis de la sentencia será la siguiente:
-OPEN ( UNIT= N, FILE='Nombre' , ACCESS=Tipo , FORM=Formato ,
STATUS=Estado , IOSTAT=N , ERR=Etiqueta , BLANK=Tipo ,
RECL=N , BLOCKSIZE=N , MODE=Tipo ).
-La sentencia OPEN es la primera sentencia que debe aparecer al utilizar
un fichero.
-La opción UNIT siempre debe figurar en la sentencia OPEN y se podrá
omitir, en cuyo caso N deberá figurar como primer parámetro.
Esta opción se encarga de asignar un canal de comunicación para
ejecutar el archivo.
-La opción FILE indica el nombre del fichero que va a estar conectado a
la unidad N. Si no se coloca el nombre del fichero se podrá pasar por
parámetro el nombre de dicho fichero.
-La opción ACCESS, donde Tipo es una expresión de tipo carácter e indica
el tipo de fichero que se va a utilizar, siendo por defecto Secuencial
y puediendo tomar los valores:
-SEQUENTIAL.
-DIRECT.
-La opción FORM, donde Formato es una expresión de tipo carácter en que
el valor por defecto es Secuencial, asigna un formato al fichero,
siendo los valores que puede tomar:
-FORMATTED.
-UNFORMATTED.
-BINARY.
-Si la opción es omitida OPEN asumirá FORMATTED si el fichero es de tipo
Secuencial y UNFORMATTED si es un fichero Directo. BINARY se utiliza en
Fortran 90 y representa a los ficheros binarios.
-La opción STATUS, donde Estado es una expresión de tipo carácter y se
usa para saber si el fichero ya existe o es nuevo y por tanto va a ser
creado. Sus opciones son las siguientes:
-OLD (Si el fichero existe, sino produce error).
-NEW (Crea el nuevo fichero y FILE no debe existir en la Unidad).
-SCRATCH (Si crea un fichero temporal y no debe darse nombre al
fichero).
-UNKNOWN (Si no se sabe si existe o no el fichero siendo la opción
por defecto).
-Un fichero SCRATCH desaparece cuando se cierra la Unidad o cuando
termina la ejecución.
-La opción IOSTAT, donde N es un identificador de una variable entera.
Almacena un código numérico de cómo se ejecuta la sentencia OPEN. Si
OPEN se ejecuta sin error se almacena un cero en N.
-La opción ERR, donde Etiqueta es la sentencia donde se bifurca
incondicionalmente si el fichero no puede ser abierto al producirse un
error.
-La opción BLANK, donde Tipo es una expresión de tipo carácter que
puede tomar los siguientes valores:
-NULL (Los blancos son ignorados y es opción por defecto).
-ZERO (Los blancos son interpretados como ceros).
-Esta opción se usa para especificar la interpretación de los espacios
en blanco en los datos de entrada.
-La opción RECL, donde N es una expresión entera, indica la longitud
en caracteres de los registros en un fichero de acceso Directo. Sólo
debe aparecer en los ficheros Directos.
-La opción BLOCKSIZE, donde N es un número entero, asigna un tamaño al
buffer de lectura intermedio.
-La opción MODE, donde Tipo es una cadena de caracteres, es el modo de
apertura del fichero. La opción por defecto es la de lectura escritura
siendo las opciones:
-READ.
-WRITE.
-READWRITE.
-Todas las opciones son opcionales excepto UNIT que es obligatorio, y si
el fichero es de acceso Directo es obligatorio especificar RECL.
ESCRITURA DE UN FICHERO SECUENCIAL.
-Consiste en transferir información desde la memoria principal al
soporte externo donde está el fichero.
-Para escribir en un fichero Secuencial se usa WRITE especificando la
Unidad a la que está conectada el fichero indicando que el fichero es
Secuencial.
-La sentencia de escritura tiene la siguiente sintaxis:
-WRITE ( UNIT= N , FORM=Formato , ERR=Etiqueta , IOSTAT=N ,
ENDFILE=Unidad ).
-La única opción obligatoria sería UNIT, todas las demás han quedado
explicadas.
-Al crear un fichero los registros se escriben uno a continuación del
otro, escribiendo un registro especial EOF al final de los datos
escritos.
-Normalmente con CLOSE el registro EOF es automáticamente escrito al
cerrar el fichero, aunque se puede usar la siguiente sentencia:
-ENDFILE N.
-ENDFILE ( UNIT= N , ERR=Etiqueta , IOSTAT=N ).
-Donde N es el número de la Unidad a la que se conectó el fichero
Secuencial. La sintaxis más empleada es la primera. Todas las demás
opciones ya han quedado explicadas.
-Si se ejecuta ENDFILE, el nombre de la Unidad a la que está conectado
un fichero nuevo, sin datos, creará un fichero vacío.
SENTENCIA DE CIERRE DE UN FICHERO "CLOSE".
-Esta sentencia rompe la conexión de un fichero con la Unidad a la que
se conectó un OPEN siendo su sintaxis:
-CLOSE ( UNIT= N , STATUS=Tipo , IOSTAT=N , ERR=Etiqueta ).
-La opción UNIT, siendo N un entero, es el número de la Unidad donde
se encuentra el fichero que se va a desconectar y puede omitirse, en
cuyo caso, será el primer parámetro de CLOSE.
-La opción STATUS, siendo Tipo una expresión tipo carácter indica el
estado del fichero en ese momento, puediendo tener los valores:
-KEEP (El fichero se guarda después de ser cerrado).
-DELETE (El fichero es borrado perdiéndose después del cierre).
-Por defecto toma el valor KEEP, excepto para los ficheros que son de
tipo SCRATCH.
-Los posibles valores que se pueden sacar de las opciones FORM y ACCESS
son los siguientes:
-Registros Secuencial-Formateados.
-Registros Secuencial-No formateados.
-Registros Directo-Formateados.
-Registros Directo-No formateados.
-Registros Binario-Formateado.
-Registros Binario-No formateado.
-Los registros de tipo Secuencial-Formateados se almacenan en código
ASCII y permiten verse con cualquier editor de texto y manipularlos.
-Si tenemos las siguientes instrucciones:
-VarI=4
OPEN (33, FILE='FSEQ')
WRITE (33, '(A, I3)') 'RECORD', I/3
WRITE (33, 'C3')
WRITE (33, '(11H El Reg-N3)')
CLOSE (33)
-La salida que dará este ejemplo serán tres segmentos de longitud
variable cuya estructura de registros será la siguiente:
-Se puede observar como después de la primera marca de fichero OA, el
segundo registro no aparece por ser de 0 bytes, mientras que el primero
tendrá 9 bytes y el tercero tendrá 11 bytes.
-Los registros de tipo Secuencial-No formateados tienen longitud
variable y no están en código ASCII, sino otro código que lo introduce
el programa y lo organiza en bloques físicos de 128 bytes como máximo.
-Si tenemos las siguientes instrucciones:
-CHARACTER Array (3)
INTEGER *4 Datos (35)
DATA Datos /35*-1/, Array / 'X', 'Y', 'Z'/
OPEN (33, FILE='UFSEQ', FORM='UNFORMATTED')
WRITE (33) Datos
WRITE (33) Array
CLOSE (33)
-La salida que dará este ejemplo será la siguiente:
-Como el bloque tiene un tamaño máximo de 128 bytes por registro, al
sacar todos los elementos del Array Datos (Que necesitará 140 bytes)
se particiona en dos registros uno de 128 bytes y otro de 12 bytes.
-Los registros de tipo Directo-Formateados tienen la misma longitud,
que se deberá especificar en la longitud del registro.
-A cada registro siempre se le añade el carácter de control de carro
(OD) y el carácter de avance de línea (OA). Si tenemos las siguientes
instrucciones:
-OPEN (33, FILE='FDIR', FORM='FORMATTED', ACCESS='DIRECT',
RECL=10)
WRITE (33, '(A)', REC=1) 'Registro 1'
WRITE (33, '(I5)', REC=3) 30303
CLOSE (33)
-La salida que dará este ejemplo será la siguiente:
-Se puede ver que del registro primero se pasa al tercero. En los
ficheros Directos, se reserva espacio para los registros.
-De esa forma si luego viene un registro segundo se insertaría entre los
registros primero y tercero.
-Los registros de tipo Directo-No formateados es la opción por defecto,
en la que la longitud del registro es la misma para todos pero el
compilador no introduce los caracteres OD y OA.
LECTURA DE UN FICHERO SECUENCIAL.
-Transfiere la información contenida en los registros del fichero a la
memoria del ordenador representada por las variables que aparecen en
la lista de la sentencia de lectura.
-La sentencia READ tiene la sintaxis para ficheros Secuenciales
siguiente:
-READ ( UNIT= N, FORM=Formato , END=Etiqueta , ERR=Etiqueta ,
IOSTAT=N , REC=N ) Lista de variables.
-La opción que siempre debe figurar es el número de Unidad perteneciente
al de apertura del fichero Secuencial.
-La opción END, donde Etiqueta es un número entero indica que al
detectar el carácter de fin de fichero transfiera el control de
ejecución del programa a la etiqueta indicada.
-Todas las demás opciones ya se han explicado.
-Para leer un fichero la primera opción a realizar es abrirlo en la
opción STATUS con el valor OLD.
POSICIONAMIENTO EN UN FICHERO SECUENCIAL.
-La lectura y escritura de registros se realiza uno a uno y en serie.
Hay dos sentencias para regresar un registro (BACKSPACE) y para
posicionarse al principio del fichero (REWIND).
-La sintaxis de BACKSPACE es la siguiente:
-BACKSPACE N.
-BACKSPACE ( UNIT= N, IOSTAT=N , ERR=Etiqueta ).
-N es el número de la Unidad a la cual está conectado el fichero. Si no
hay registro anterior porque el fichero se acaba de abrir no tiene
efecto.
-Todas las demás opciones ya se han explicado.
-La sentencia REWIND tiene la siguiente sintaxis:
-REWIND N.
-REWIND ( UNIT= N, IOSTAT=N , ERR=Etiqueta ).
-El efecto es rebobinar el fichero al comienzo, apuntando al primer
registro. Todas las demás opciones ya se han explicado.
CREACION DE UN FICHERO DE ACCESO DIRECTO.
-Cada registro de un fichero de acceso Directo es identificado
únicamente por su posición lógica en el fichero o número de registro
que es un entero de 1 a n.
-El acceso a los registros se hace siempre a partir del número de
registro con el que fue creado. En un fichero de acceso Directo no
tiene sentido el registro EOF.
-Por ello ENDFILE no se debe ejecutar sobre estos ficheros, porque no
tiene efecto.
-En un fichero de acceso Directo se reserva espacio de almacenamiento
para todos los posibles registros.
-En los ficheros de acceso Directo los datos de entrada o de salida
deben ir siempre con formato. Este tipo de ficheros es creado al
abrirlo, especificando acceso directo y dándole una longitud.
-Los ficheros no formateados guardan la información en código binario,
siendo el acceso a los registros más rápidos porque se elimina el
tiempo de conversión a binario.
-Los registros pueden ser escritos o leídos en cualquier orden. Siempre
hay que indicar en las sentencias READ y WRITE un parámetro REC que
indicará el número de registro a acceder.
-El proceso para leer un registro es similar al de escribir. Hay que
especificar el número de registro que se quiere leer.
SENTENCIA "INQUIRE".
-Con esta sentencia durante la ejecución de un programa puede obtenerse
información sobre las características de una Unidad o de un fichero.
Puede ejecutarse antes de que un fichero haya sido abierto, conectado
a una Unidad.
-La información que puede requerirse de un fichero o de una Unidad es
muy variada. La sintaxis para esta sentencia es la siguiente:
-INQUIRE (UNIT=N, Lista de especificadores).
-Donde N es un número de unidad sobre el que se va a preguntar siendo
la lista de especificadores opcionales los siguientes:
-ACCESS=Var*10 ('SEQUENTIAL' o 'DIRECT').
-BLANK=Var*4 ('NULL' o 'ZERO').
-DIRECT=Var*7 ('YES', 'NO' o 'UNKNOWN').
-EXIST=Var ('.TRUE.' o '.FALSE.').
-FORM=Var ('UNFORMATTED' o 'FORMATTED).
-FORMATTED=Var ('YES', 'NO' o 'UNKNOWN').
-NAME=Var*3 ('.TRUE.', '.FALSE.' o 'Nombre').
-NEXTREC=N (Registro después del último accedido).
-NUMBER=N (Número de Unidad igual a UNIT).
-OPENED=Var ('.TRUE.' o '.FALSE.').
-RECL=N (Longitud del registro).
-SEQUENTIAL=Var ('YES', 'NO' o 'UNKNOWN').
-UNFORMATTED=Var ('YES', 'NO' o 'UNKNOWN').
-IOSTAT=N (Código de estado).
-ERR=Etiqueta (Bifurcaciones de error).
-BINARY=Var*10 ('YES', 'NO' o 'UNKNOWN').
-BLOKSIZE=N (Tamaño del buffer).
-Si se produce error en INQUIRE todas las variables que figuran en la
sentencia queda un valor indefinido excepto la variable entera de
STATUS y las variables de los especificadores pueden ser elementos de
un Array.
-Otra posibilidad de INQUIRE es preguntar por el fichero con la
siguiente sintaxis:
-INQUIRE (FILE='Nombre', Lista de especificadores).
-La lista de especificadores es la misma que la anterior. Si el nombre
del fichero es un identificador válido para el sistema y si el fichero
existe se añadirán los siguientes:
-DIRECT, FORMATTED, NAME, SEQUENTIAL y UNFORMATTED.
-Si el fichero está abierto puede aplicarse:
-ACCESS, BLANK, FORM, NEXTREC, NUMBER, BELL, IOSTAT y ERR.
-La ventaja es que provee de información muy valiosa para abrir ficheros
o evitar errores que abortan la ejecución de un programa.
FICHEROS INTERNOS.
-Cuando el programa ejecuta READ o WRITE con un fichero o dispositivo
externo se realizan las dos operaciones conjuntamente.
-En los ficheros internos la transferencia de información se produce
entre dos áreas de memoria interna. Un fichero interno es un área de
almacenamiento interno.
-Las entradas o salidas con ficheros internos deben ser siempre
formateadas con los códigos de formato deseados por el programador.
-Con los ficheros internos hay que especificar siempre los códigos de
formato en las sentencias WRITE y READ.
-Para acceder a más de un registro en un fichero interno hay que
ejecutar una sóla vez la sentencia READ o WRITE.
-Las opciones que no se permiten usar son las siguientes:
-OPEN, CLOSE, INQUIRE, REWIND, BACKSPACE y ENDFILE.
FICHEROS BINARIOS.
-Es un fichero de tipo Secuencial aunque también podemos tener ficheros
Directos, pero de esta forma permite recibir o escribir más de un
registro a la vez.
-No se separan los registros y se lee de la misma manera pero en el
Directo hay que poner en la opción de formato lo siguiente:
-FORM='BINARY'.
-Si tenemos las siguientes instrucciones:
-INTEGER *1 VarA (4)
CHARACTER VarB (3)
CHARACTER *4 VarC
DATA VarA /4*7/
DATA VarC /'Esto'/, VarB /'A', 'B', 'C'/
OPEN (33, FILE='FBIN', FORM='BINARY')
WRITE (33) VarB, VarC
WRITE (33) 'Que', 'Quieres'
WRITE (33) VarA
CLOSE (33)
-La salida que producirá en el registro será la siguiente:
-Notar que la separación es imaginaria. Siempre en un fichero Directo
se han de inicializar las variables normalmente.