Capítulo 5
Creando y con archivos

Hay dos tipos de archivos en sistemas del MS-DOS:

5.1 Comandos Del Archivo Del Programa

Los siguientes son los comandos y las declaraciones usados lo más con frecuencia posible con los archivos del programa. La referencia del usuario de GW-BASIC contiene más información sobre cada uno de ellos.

SAVE filename[,a][,p]

Escribe al diskette el programa que reside actualmente en memoria.

LOAD filename[,r]

Carga el programa de un diskette en memoria. LOAD cancela el contenido actual de la memoria y cierra todos los archivos antes de cargar el programa.

RUN filename[,r]

Carga el programa de un diskette en memoria y lo funciona inmediatamente. RUN las cancelaciones el contenido actual de la memoria y cierra todos los archivos antes de cargar el programa.

MERGE filename

Carga el programa de un diskette en memoria, pero no suprime el programa actual ya en memoria.

KILL filename

Suprime el archivo de un diskette. Este comando se puede también utilizar con los ficheros de datos.

NAME old filename AS new filename

Cambia el nombre de un archivo de diskette. Solamente el nombre del archivo se cambia. El archivo no se modifica, y permanece en el mismo espacio y posición respecto al disco. Este comando se puede también utilizar con los ficheros de datos.


5.2 Ficheros De Datos

Los programas de GW-BASIC pueden trabajar con dos tipos de ficheros de datos:

Los archivos secuenciales son más fáciles de crear que archivos de acceso al azar, pero se limitan en flexibilidad y velocidad al tener acceso a datos. Los datos escritos a un archivo secuencial son una serie de caracteres de ASCII. Los datos se almacenan, un artículo después de otro (secuencialmente), en la orden enviada. Los datos se leen detrás de la misma manera.

Que crea y que tiene acceso el acceso al azar archivos requiere más pasos del programa que archivos secuenciales, pero los archivos al azar requieren menos sitio en el disco, porque GW-BASIC los almacena en un formato comprimido en la forma de una secuencia.

Las secciones siguientes discuten cómo crear y utilizar estos dos tipos de ficheros de datos.

5.2.1 Crear un archivo secuencial

Las declaraciones y las funciones siguientes se utilizan con los archivos secuenciales:

CLOSE LOF
EOF OPEN
INPUT# PRINT#
LINE INPUT# PRINT# USING
LOC UNLOCK
LOCK WRITE#

Los pasos siguientes del programa se requieren para crear un archivo secuencial y para tener acceso a los datos en el archivo:

  1. Abra el archivo en modode la salida (o). El programa actual utilizará este archivo primero para la salida:
    OPEN "O",#1,"filename"
  2. Escriba los datos al archivo usando el  PRINT# or WRITE# declaración:
     PRINT#1,A$
     PRINT#1,B$
     PRINT#1,C$
  1. Para tener acceso a los datos en el archivo, usted debe cerrar el archivo y abrirlo de nuevo en modo de la entrada (i):
    CLOSE #1
    OPEN "I",#1,"filename
  2. Utilice INPUT# or LINE INPUT# la declaración a los datos leídos del archivo secuencial en el programa:
    INPUT#1,X$,Y$,Z$

El ejemplo 1 es un programa corto que crea un archivo secuencial, datos, de la entrada de información en el terminal.

Ejemplo 1

10 OPEN "O",#1,"DATA"
20 INPUT "NAME";N$
30 IF N$="DONE" THEN END
40 INPUT "DEPARTMENT";D$
50 INPUT "DATE HIRED";H$
60 PRINT#1,N$;","D$",";H$
70 PRINT:GOTO 20
RUN
 NAME? MICKEY MOUSE
 DEPARTMENT? AUDIO/VISUAL AIDS
 DATE HIRED? 01/12/72
 NAME? SHERLOCK HOLMES
 DEPARTMENT? RESEARCH
 DATE HIRED? 12/03/65
 NAME? EBENEEZER SCROOGE
 DEPARTMENT? ACCOUNTING
 DATE HIRED? 04/27/78
 NAME? SUPER MANN
 DEPARTMENT? MAINTENANCE
 DATE HIRED? 08/16/78
 NAME? DONE
OK

5.2.2 Tener acceso a un archivo secuencial

El programa en el ejemplo 2 tiene acceso a los datos del archivo, creados en el programa en el ejemplo 1, y exhibe el nombre de cada uno empleado en 1978.

Ejemplo 2

10 OPEN "I",#1,"DATA"
20 INPUT#1,N$,D$,H$
30 IF RIGHT$(H$,2)="78" THEN PRINT N$
40 GOTO 20
50 CLOSE #1
RUN
 EBENEEZER SCROOGE
 SUPER MANN
Input past end in 20
Ok

El programa en el ejemplo 2 lee, secuencialmente, cada artículo en el archivo. Cuando se han leído todos los datos, la línea 20 hace "Input past end". Para evitar este error, inserte la línea 15, que utiliza la función EOF para probar para el extremo del archivo:

15 IF EOF(1) THEN END

y cambie línea 40 a GOTO 15.

Un programa que crea un archivo secuencial puede también escribir datos ajustados a formato al diskette con la IMPRESIÓN # CON la declaración. Por ejemplo, la declaración siguiente se podía utilizar para escribir datos numéricos al diskette sin los delimitadores explícitos:

PRINT#1, USING"####.##,"; A, B, C, D

La coma en el extremo de la secuencia del formato sirve para separar los artículos en el archivo de disco.

La función LOC, cuando está utilizada con un archivo secuencial, vuelve el número de los expedientes(records) 128-byte que se han escrito a o leyó en el archivo puesto que fue abierta.

5.2.3 Adición de datos a un archivo secuencial

Cuando un archivo secuencial se abre en modo de O, se destruye el contenido actual. Para agregar datos a un archivo existente sin destruir su contenido, abra el archivo adentro añaden(a) modo.

El programa en el ejemplo 3 se puede utilizar para crear, o agregar sobre un archivo llamó nombres. Este programa ilustra el uso de LINE INPUT . LINE INPUT leerá caracteres hasta que considera un indicador del retorno del carro, o hasta que ha leído 255 caracteres. No para en las marcas o las comas de la cita.

Ejemplo 3

10 ON ERROR GOTO 2000
20 OPEN "A", #1, "NAMES"
110 REM ADD NEW ENTRIES TO FILE
120 INPUT "NAME"; N$
130 IF N$="" THEN 200 `CARRIAGE RETURN EXITS INPUT LOOP
140 LINE INPUT "ADDRESS? "; A$
150 LINE INPUT "BIRTHDAY? "; B$
160 PRINT#1, N$
170 PRINT#1, A$
180 PRINT#1, B$
190 PRINT: GOTO 120
200 CLOSE #1
2000 ON ERROR GOTO 0

En las líneas 10 y 2000 la instruccion ON ERROR GOTO es usada.Esta declaración permite la interceptación del error y especifica la primera línea (2000) del subprograma de la gestión de error. La línea 10 permite la rutina de gestión de errores. La línea 2000 inhabilita la rutina de gestión de errores y es el punto adonde GW-BASIC ramifica para imprimir los mensajes de error.

5.3 Archivos De Acceso Al azar mejor conocido como Random Access Files

La información en archivos de acceso al azar se almacena y está alcanzada en distinto, numerado las unidades llamadas los expedientes. Puesto que la información es llamada por número, los datos se pueden llamar de cualquier localización del disco; el programa no necesita leído el disco entero, como al intentar archivos secuenciales, para localizar datos. GW-BASIC apoya archivos al azar grandes. El número máximo del registro lógico es 232 -1.

Las declaraciones y las funciones siguientes se utilizan con los archivos al azar:

CLOSE FIELD MKI$
CVD LOC MKS$
CVI LOCK OPEN
CVS LOF PUT
EOF LSET/RSET UNLOCK
ET MKD$

5.3.1 Crear un archivo de acceso al azar

Los pasos siguientes del programa se requieren para crear un fichero de datos al azar:

  1. Abra el archivo para el modo del accesoal azar (r). El ejemplo siguiente especifica una longitud de registro de 32 octetos. Si se omite la longitud de registro, el defecto es 128 octetos.
    OPEN "R", #1, "filename", 32
  2. Utilice la declaración del CAMPO para asignar el espacio en el almacenador intermediario al azar para las variables que serán escritas al archivo al azar:
    FIELD#1, 20 AS N$, 4 AS A$, 8 AS P$

    En este ejemplo, las primeras 20 posiciones (octetos) en el almacenador intermediario del archivo al azar se asignan a la secuencia N$ variable. Las 4 posiciones siguientes se asignan a A$; los 8 siguientes a P$.

  3. Utilice LSET o RSET para mover los datos en los campos al azar del almacenador intermediario en el formato de la izquierda o derecho-justificado (L=left SET;R=right SET). Los valores numéricos se deben hacer en secuencias cuando están colocados en el almacenador intermediario. MKI$ convierte un valor del número entero en una secuencia; MKS$ convierte un valor de la solo-precisio'n, y MKD$ convierte un valor de precisión doble.
    LSET N$=X$
    LSET A$=MKS$(AMT)
    LSET P$=TEL$
  4. Escriba los datos del almacenador intermediario al diskette usando la declaración PUESTA:
    PUT #1, CODE%

El programa del ejemplo 4 toma información "keyed as input" y lo escribe a un fichero de datos del acceso al azar. Cada vez que se ejecuta la declaración PUT, un expediente se escribe al archivo. En el ejemplo, el 2-digit CODE% input en la línea 30 se convierte en el número de registro.


Nota

No utilice una variable cadena en una instruccion INPUT or LET. Esto hace que el indicador para esa variable señalar dentro de ella una cadena de espacios en el buffer del archivo al azar.


Ejemplo 4

 

10 OPEN "R", #1, "INFOFILE", 32
20 FIELD#1, 20 AS N$, 4 AS A$, 8 AS P$
30 INPUT "2-DIGIT CODE"; CODE%
40 INPUT "NAME"; X$
50 INPUT "AMOUNT"; AMT
60 INPUT "PHONE"; TEL$: PRINT
70 LSET N$=X$
80 LSET A$=MKS$(AMT)
90 LSET P$=TEL$
100 PUT #1, CODE%
110 GOTO 30

 

5.3.2 Tener acceso a un archivo de acceso al azar

Los pasos siguientes del programa se requieren para tener acceso a un archivo al azar:

  1. Abra el archivo en modo de R:
    OPEN "R", #1, "filename", 32
  2. Utilice la declaración del FIELD para asignar el espacio en el almacenador intermediario al azar para las variables que serán leídas en el archivo:
    FIELD, #1, 20 AS N$, 4 AS A$, 8 AS P$

    En este ejemplo, las primeras 20 posiciones (octetos) en el almacenador intermediario del archivo al azar se asignan a la secuencia N$ variable. Las 4 posiciones siguientes se asignan a A$; los 8 siguientes a P$.


    Nota

    En un programa que se realice INPUT y OUTPUT en el mismo archivo al azar, usted puede utilizar a menudo apenas una declaración OPEN y una declaración FIELD.


  3. Utilice la declaración del GET para mover el expediente deseado en el almacenador intermediario al azar.
    GET # 1, CODE%

    Los datos en el almacenador intermediario se pueden ahora alcanzar por el programa.

  4. Convierta los valores numéricos de nuevo a números usando las funciones del convertido: CVI para los números enteros, CVS para los valores de la solo-precisio'n, y CVD para los valores de precisión doble.
  PRINT N$
  PRINT CVS(A$)
  .
  .
  .

El programa en el ejemplo 5 tiene acceso al archivo al azar, infofile, que fue creado en el ejemplo 4. Entrando el código 3-digit, la información asociada a ese código es leída en el archivo y exhibida.

Ejemplo 5

10 OPEN "R",#1,"INFOFILE",32
20 FIELD #1, 20 AS N$, 4 AS A$, 8 AS P$
30 INPUT "2-DIGIT CODE";CODE%
40 GET #1, CODE%
50 PRINT N$
60 PRINT USING "$$###.##";CVS(A$)
70 PRINT P$:PRINT
80 GOTO 30

Con los archivos al azar, la función del LOC vuelve el número de registro actual. El número de registro actual es el número de registro pasado usado en un CONSEGUIR o una declaración PUESTA. Por ejemplo, la línea siguiente termina la ejecución de programa si el número de registro actual en file#1 es más alto de 99:

IF LOC(1)>99 THEN END

El ejemplo 6 es un programa del inventario que ilustra el acceso del archivo al azar. En este programa, el número de registro se utiliza como el número de pieza, y se asume que el inventario contendrá no más de 100 diversos números de pieza.

Las líneas 900-960 inicializan el fichero de datos por la escritura CHR$(255) como el primer carácter de cada expediente. Esto se utiliza más adelante (la línea 270 y la línea 500) para determinarse si una entrada existe ya para ese número de pieza.

Líneas exhibición de 130-220 las diversas funciones del inventario que el programa realiza. Cuando usted mecanografía adentro el número deseado de la función, alinee 230 ramas al subprograma apropiado.

Example 6

120 OPEN"R",#1,"INVEN.DAT",39
125 FIELD#1,1 AS F$,30 AS D$, 2 AS Q$,2 AS R$,4 AS P$
130 PRINT:PRINT "FUNCTIONS:":PRINT
135 PRINT 1,"INITIALIZE FILE"
140 PRINT 2,"CREATE A NEW ENTRY"
150 PRINT 3,"DISPLAY INVENTORY FOR ONE PART"
160 PRINT 4,"ADD TO STOCK"
170 PRINT 5,"SUBTRACT FROM STOCK"
180 PRINT 6,"DISPLAY ALL ITEMS BELOW REORDER LEVEL"
220 PRINT:PRINT:INPUT"FUNCTION";FUNCTION
225 IF (FUNCTION<1)OR(FUNCTION>6) THEN PRINT "BAD FUNCTION NUMBER":GOTO 130
230 ON FUNCTION GOSUB 900,250,390,480,560,680
240 GOTO 220
250 REM BUILD NEW ENTRY
260 GOSUB 840
270 IF ASC(F$) < > 255 THEN INPUT"OVERWRITE";A$: IF A$ < > "Y" THEN RETURN
280 LSET F$=CHR$(0)
290 INPUT "DESCRIPTION";DESC$
300 LSET D$=DESC$
310 INPUT "QUANTITY IN STOCK";Q%
320 LSET Q$=MKI$(Q%)
330 INPUT "REORDER LEVEL";R%
340 LSET R$=MKI$(R%)
350 INPUT "UNIT PRICE";P
360 LSET P$=MKS$(P)
370 PUT#1,PART%
380 RETURN
390 REM DISPLAY ENTRY
400 GOSUB 840
410 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN
420 PRINT USING "PART NUMBER ###";PART%
430 PRINT D$
440 PRINT USING "QUANTITY ON HAND #####";CVI(Q$)
450 PRINT USING "REORDER LEVEL #####";CVI(R$)
460 PRINT USING "UNIT PRICE $$##.##";CVS(P$)
470 RETURN
480 REM ADD TO STOCK
490 GOSUB 840
500 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN
510 PRINT D$:INPUT "QUANTITY TO ADD";A%
520 Q%=CVI(Q$)+A%
530 LSET Q$=MKI$(Q%)
540 PUT#1,PART%
550 RETURN
560 REM REMOVE FROM STOCK
570 GOSUB 840
580 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN
590 PRINT D$
600 INPUT "QUANTITY TO SUBTRACT";S%
610 Q%=CVI(Q$)
620 IF (Q%-S%)<0 THEN PRINT "ONLY";Q%;"IN STOCK" :GOTO 600
630 Q%=Q%-S%
640 IF Q%= < CVI(R$) THEN PRINT "QUANTITY NOW";Q%;"REORDER LEVEL";CVI(R$)
650 LSET Q$=MKI$(Q%)
660 PUT#1,PART%
670 RETURN
680 REM DISPLAY ITEMS BELOW REORDER LEVEL4
690 FOR I=1 TO 100
710 GET#1,I
720 IF CVI(Q$)<CVI(R$) THEN PRINT D$;"QUANTITY";CVI(Q$) TAB(50) "REORDER LEVEL";CVI(R$)
730 NEXT I
740 RETURN
840 INPUT "PART NUMBER";PART%
850 IF(PART% < 1)OR(PART% > 100) THEN PRINT "BAD PART NUMBER":GOTO 840 ELSE GET#1,PART%:RETURN
890 END
900 REM INITIALIZE FILE
910 INPUT "ARE YOU SURE";B$:IF B$ < > "Y" THEN RETURN
920 LSET F$=CHR$(255)
930 FOR I=1 TO 100
940 PUT#1,I
950 NEXT I
960 RETURN

 

 

 

1