Hay dos tipos de archivos en sistemas del MS-DOS:
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.
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.
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:
OPEN "O",#1,"filename"
PRINT#1,A$ PRINT#1,B$ PRINT#1,C$
CLOSE #1 OPEN "I",#1,"filename
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.
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
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.
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.
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.
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.
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$ |
Los pasos siguientes del programa se requieren para crear un fichero de datos al azar:
OPEN "R", #1, "filename", 32
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$.
LSET N$=X$ LSET A$=MKS$(AMT) LSET P$=TEL$
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.
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
Los pasos siguientes del programa se requieren para tener acceso a un archivo al azar:
OPEN "R", #1, "filename", 32
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.
GET # 1, CODE%
Los datos en el almacenador intermediario se pueden ahora alcanzar por el programa.
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.
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.
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