miércoles, 24 de junio de 2009

Ejemplo de escritura en un fichero secuencial

Le proponemos un ejemplo "sui generis" de fichero secuencial: la escritura de un fichero en el que están incluidos los elementos de una matriz rectangular de números. La grabación se iniciará desde el principio, línea por línea.

Sabemos que en BASIC las matrices son tablas (o "arrays") que residen en la memoria central, como todas las variables; pero pueden existir dos motivos válidos para querer que los datos de estas tablas se incluyan en un fichero exterior. El primero, evidentemente, es la conservación de las propias matrices, y el segundo es que las matrices muy grandes no pueden "residir" por completo en la memoria central. Por ejemplo, una matriz de 100><100 números enteros ocupa 20.000 bytes (10.000 números, cada uno de los cuales está almacenado en 2 bytes). Muchos pequeños ordenadores no pueden disponer fácilmente de tanta capacidad de memoria para una sola matriz, por lo que se tiene que probar a grabarlas en periféricos externos.

Veamos, pues, cómo escribir en un fichero secuencial una matriz, elemento por elemento y línea por línea.

Supongamos que la matriz tenga 100 filas y 50 columnas, lo que indicamos en la línea 160 con las dos variables TR y TC. En la línea 190 abrimos el fichero (las instrucciones son las del BASIC Microsoft), en donde "O" indica que el fichero está abierto en escritura ("output"), el número de canal que elegimos es el número 1 (#1) y el nombre que damos al fichero es de MAT. SEC.

Los dos bucles FOR NEXT permiten tomar en la entrada, desde el teclado, y luego escribir en el fichero uno por uno los ele-

mentos de la matriz. En la línea 270 se presenta en la pantalla el mensaje de solicitud de un elemento. Por ejemplo, para el primer elemento aparecería:

FILA 1 - COL 1:

a lo que se debe responder con el valor numérico del primer elemento. Tenga presente que estos números son de tipo real, y no entero, como dijimos anteriormente, por lo que la matriz ocupa muchos más bytes (4 bytes por cada número real en el BASIC Microsoft).

En la línea 290 el número E se graba en el fichero. Cada registro del fichero contiene, pues, un único número real.

La instrucción CLOSE#l en la línea 330 cierra el fichero. Su existencia es fundamental, porque garantiza que el último bloque de datos se transfiera efectivamente a la memoria exterior.

Tratemos de explicar mejor este punto, al que se hizo alusión con anterioridad. La grabación de los datos en un disco (o en una cinta de cásete) no tiene lugar realmente cada vez que el ordenador encuentra una instrucción PRINT#, sino solamente cuando el buffer preparado para dicho fichero está lleno de datos. No tiene por qué preocuparse, ya que estos problemas no afectan al programador, sino que son competencia exclusiva del sistema operativo DOS.

Si, por ejemplo, el buffer tiene una longitud de 256 bytes y se graban números de 4 bytes a los que se añade un carácter separador de registro (como Return, ASCII 13), dando un total de 5 bytes por regsitro (en los ficheros directos la cuestión es diferente al faltar los separadores), en el buffer cabrán 256/5=51 registros completos. El byte que sobra es inutilizado. En este caso solamente después de 51 instrucciones PRINT#1, el buffer se "trasvasará" al exterior y se verá girar el disco o la cinta de cásete. Cuando se ejecute la última instrucción PRINT# es poco probable que coincida con el llenado del buffer, por lo que si en este momento apagáramos el ordenador o finalizara el programa, los últimos registros que se encuentran cargados en el buffer se perderían. CLOSE tiene precisamente el cometido de almacenar el último resto de fichero, es decir, trasvasar el último buffer, además de avisar al sistema DOS de que las operaciones en ese fichero están terminadas.

ICO REM

110 REli * ESCRITURA DE UNA *

120 REM * MATRIZ DE NUMEROS *

130 REM * EN UN FICHERO SECUENCIAL * 140 REM (i*************************** 150 REM

160 TR-100:TC=50:REM MATRIZ DE 100 X 50

170 REM P 180 REM

190 OPEN "Q",#l,"MAT.SEC" 200 REM

210 REM ESCRITURA DE LA MATRIZ 220 REM

230 PRINT "DAR LOS VALORES DE LOS ELEMENTOS:" 240 REM

250 FOR J=l TO TR 260 FOR K»l TO TC

270 PRINT "FILA "jj¡" - COL "jKs" :" 280 INPUT E 290 PRINT #1,E 300 NEXT K 310 NEXT J '320 REM 330 CLOSE #1 340 REM 350 END

Más adelante, después de que estudiemos las instrucciones de lectura de los ficheros secuenciales, veremos cómo leer la matriz.

A modo de inciso, recordemos que el ordenador Spectrum realiza la grabación de una matriz directamente con la instrucción SAVE DATA.

No hay comentarios:

Publicar un comentario