viernes, 26 de junio de 2009

GET# e INPUT$

Acabamos de hacer alusión al hecho de que, a menudo, es preferible leer un fichero secuencial que contenga datos del tipo de cadena, en forma de un carácter cada vez. Esto es así para evitar los inconvenientes de la instrucción INPUT#, que exige una correspondencia rígida entre sus variables y los campos del registro separados por las comas.

En este caso ya no existen campos y registros del fichero, sino que la destribución lógica debe ser reconstruida por el programa de lectura.

Así, en el ejemplo siguiente, en la cadean R$ "acumulamos" un registro leyendo un carácter cada vez. Al comienzo de cada campo, la cadena R$ se pondrá a cero (línea 150); a través de la instrucción INPUT$ se lee y asigna a la variable A$ un carácter desde el canal número 1 (#1) abierto con anterioridad. El primer número 1, entre los paréntesis de la instrucción, indica precisamente que se lee un solo carácter; en realidad, INPUT$ permitiría que se leyese más de uno. Inmediatamente después se efectúan dos comprobaciones: si el carácter leído es una coma (ASCII 44), el programa pasará al control del campo, y si el carácter es Re-turn (ASCII 13), se terminará el registro. En todos los demás casos el carácter se añade a la cadena R$ (línea 190). Después del control de campo o de registro, el programa volverá a la línea 150.

150 R*=" "

160 A*=INPUT*<1,#1>

165 REI"!

170 IF A*=CHR*<44> THEN GOTO 200 180 IF A*=CHR*(13) THEN GOTO 300 190 R*=R*+A*: GOTO 160 195 REM

200 ... R* Contiene un campo

300 ... Final de registro,R* contiene el ultimo campo

Si se emplea la instrucción GET#, la línea 160 debe cambiarse como sigue:

160 GET#1,A*

Si el fichero contiene datos numéricos, grabados con variables numéricas, se debe utilizar INPUT# por cuanto que GET# e INPUT$, al leer un carácter cada vez, harían muy difícil la reconstrucción de los números expresados en forma exponencial (por ejemplo: 3.456 E-8).

Se podría pensar que la lectura de un fichero con GET# (un carácter cada vez) es mucho más lenta en relación con la efectuada con INPUT# (un registro completo), pero, en realidad, el tiempo empleado es prácticamente igual. GET# ofrece, no obstante, la ventaja de que cualquier cosa que se escriba en el fichero puede ser leída como si se programase en lenguaje máquina. Exige, pues, un poco más de dominio y de atención.

No hay comentarios:

Publicar un comentario