Toolkit II, Manual de Usuario
Anterior Siguiente

12 Acceso Directo a los Ficheros

En el QDOS, los ficheros aparecen como un flujo continuo de bytes. En dispositivos de directorio (Microdrives, discos duros, etc.), el puntero del fichero puede ser colocado en cualquier posición del fichero. De esta forma, es posible el acceso directo a cualquier dato almacenado en el fichero. Acceso implica tanto acceso para lectura como, siempre que el fichero no haya sido abierto sólo para lectura, acceso para escritura. Se pueden escribir a y leer desde cualquier posición del fichero partes tan pequeñas como un sólo byte. El QDOS no impone ninguna estructura fija para el registro en los ficheros: las aplicaciones pueden hacerlo, si lo desean.

Se dan procedimientos para el acceso a bytes únicos, a números enteros y en coma flotante, y a cadenas. Hay también una función para encontrar la posición actual en el fichero.

Con el fín de mantener en orden los ficheros, hay un comando que permite truncarlos (cuando ya no se requiera la información de la parte final del fichero), y otro para nivelar los amortiguadores ("buffers") del fichero.

En los comandos de acceso directo para entradas y salidas (E/S) se debe especificar el canal de entrada/salida, el puntero a la posición en el fichero en la cual comenzará la operación de entrada/salida, y la lista de ítems que entrarán o saldrán.

COMANDO #canal,ítems

Normalmente se especificará el número de canal para los comandos de E/S directa, siendo, en caso contrario, #3 el valor de omisión. Si no se da la posición, las rutinas leerán o escribirán a partir de la posición actual; de lo contrario, se busca la posición dada antes de procesar la lista de ítems de E/S. Si el puntero es una variable en coma flotante en lugar de una expresión, una vez efectuada la lectura/escritura en el fichero, el valor de dicha variable será actualizado a la nueva posición actual del puntero en el fichero. Si no se da ningún ítem, no se escribirá/leerá nada en el fichero; en este caso, el comando puede ser usado para posicionar el puntero en un lugar determinado del fichero para el uso de otros comandos (por ejemplo, INPUT para entradas formateadas).

12.1 Entradas/Salidas (E/S) de Bytes

BGET #canal,ítems lee bytes de un fichero
BPUT #canal,ítems escribe bytes en un fichero

BGET lee 0 ó más bytes de un canal. BPUT escribe 0 ó más bytes en un canal. Para BGET, los ítems deben ser variables de coma flotante o enteras; para cada variable se coge un byte del canal. Para BPUT, los ítems deben ser variables que puedan ser evaluadas a un número entero entre 0 y 255; por cada ítem se envía un byte al canal de salida.

Por ejemplo, las sentencias

abcd=2.6
zz%=243
BPUT #3, abcd+1,"12",zz%

escribirán los bytes/caracteres correspondientes a los valores 4, 12 y 243 a continuación de la posición actual del puntero en el fichero abierto como canal #3.

Siempre y cuando no se intente seleccionar la posición del puntero del fichero, las rutinas de E/S directa pueden usarse también para enviar de forma no formateada datos a dispositivos que no formen parte del sistema de ficheros. Así, si se abre el canal #3 a una impresora compatible EPSON, se podrá seleccionar la letra condensada-subrayada, bien con

BPUT #3,15,27,45,1

o con

PRINT #3,chr$(15);chr$(27);"-";chr$(1);

¿Cuál es más fácil?

12.2 Entradas/Salidas (E/S) No Formateadas

Es posible leer y escribir valores en su formato interno. Los comandos PRINT e INPUT del SuperBASIC utilizan E/S formateadas, mientras que las rutinas GET y PUT de E/S directa utilizan E/S no formateadas. Por ejemplo,

PRINT 1.5

imprimirá los bytes 49 ("1"), 46 (".") y 53 ("5"). Sin embargo, dicho número es representado internamente mediante 6 bytes (igual que todos los números en coma flotante). Estos seis bytes tienen el valor 08 01 60 00 00 00 (en hexadecimal).

PUT 1.5

enviará los seis bytes anteriores al canal de salida.

El formato interno de un número entero es de dos bytes (siendo el primero el más significativo). El formato interno de un número en coma flotante es de 6 bytes: los dos primeros representan el exponente (al que se le ha sumado el valor hexadecimal $81F) y los cuatro siguientes la mantisa (normalizada de forma que los dos bits más significativos -el 31 y el 30- sean diferentes) de la representación del número en base 2. Una cadena se representa internamente mediante sus caracteres precedidos por dos bytes que indican la longitud de la cadena.

GET #canal,items lee de un fichero datos en el formato interno
PUT #canal,items escribe en un fichero datos en el formato interno

En GET, cada ítem debe ser una variable ya sea entera, en coma flotante o de cadena. Cada ítem debe corresponderse con el tipo de dato escrito en el fichero. En PUT, el tipo de dato escrito en el canal es el tipo del ítem en la lista de parámetros. Los comandos

puntofich=54
....
num%=42:salario=78000:nombre%="Smith"
PUT #3,num%,salario,nombre$

posicionarán el puntero en el byte 54 del fichero abierto en el canal 3, y escribirán 2 bytes correspondientes al número entero 42, 6 bytes correspondientes al número en coma flotante 78000, y 7 bytes (dos que indicarán la longitud de la cadena y sus cinco caracteres) correspondientes a "Smith". La variable "puntofich" tomará el nuevo valor de 69 (=54+2+6+7).

Contrariamente al caso de variables o elementos de matrices, una expresión puede ser, a veces, escrita en diferentes tipos de formato. Se puede forzar un tipo concreto con uno de los siguientes trucos:

Así

xyz$="ab258.z"
....
PUT #3 \ 37,xyz$(3 to 5)||0

posicionará el fichero abierto en el canal 3 en su byte 37 y escribirá el entero 258 en el fichero en la forma de dos bytes de valor 1 y 2 (ya que 258=1*256+2).

12.3 Interrupción de un Fichero

TRUNCATE #canal interrumpe un fichero

Si no se da una posición, el fichero es interrumpido en la posición actual.

TRUNCATE #dbcan

interrumpirá el fichero abierto en el canal "dbcan".

12.4 Restauración de Memoria Intermedia

FLUSH #canal restaura la memoria intermedia del fichero

En el QDOS, los controladores de dispositivo de tipo directorio mantienen la mayor parte posible de un fichero en RAM. Por ello, un fichero puede quedar en una forma incompleta en caso de un fallo de la corriente o de cualquier otro accidente. El comando FLUSH ("nivelar") permite la actualización de un fichero sin necesidad de cerrarlo. El cierre de un fichero causa siempre su restauración. El Toolkit II actualiza las rutinas de los microdrives de manera que puedan efectuar una restauración completa. Sin embargo, FLUSH no trabajará con los sistemas de disco MicroPeripherals a no ser que hayan sido actualizados a la versión QFLP.

12.5 Posición de un Fichero

La función FPOS ayuda al trabajo con ficheros en acceso directo ya que devuelve la posición actual del puntero del fichero. Su sintaxis es:

FPOS(#canal) devuelve la posición del fichero

Por ejemplo:

PUT #4,102,valor1,valor2
ptr=FPOS(#4)

asignará a "ptr" el valor 114 (=102+6+6).

La posición del puntero del fichero puede ser seleccionada mediante los comandos BGET, BPUT, GET o PUT sin ningún ítem para leer o escribir. Si se intenta poner el puntero más allá del final del fichero, éste será colocado al final, no devolviéndose ningún mensaje de error. Obsérvese que la selección de la posición del puntero no significa que dicha parte del fichero esté realmente en un buffer, sino que dicha parte está siendo buscada. De esta forma es posible que una aplicación controle la prebúsqueda de partes de un fichero en las que el controlador de dispositivo es capaz de prebúsqueda.


Anterior Índice de Materias Siguiente
Información de ficheros   Conversiones de formato