19. Ficheros
BASIC
19. Ficheros
19.1. Nociones básicas
El manejo de ficheros también es algo que varía mucho de una versión a otra, así que veremos sólo un ejemplo sencillo que nos ayude a entender los fundamentos.
Emplearemos QBasic, que permite más posibilidades que otros BASIC más antiguos.
Los pasos básicos para acceder a un fichero serán;
- Abrir el fichero.
- Leer datos o guardarlos.
- Cerrar el fichero.
Hay básicamente dos formas de acceder a un fichero: de modo secuencial (leer un dato tras otro, en "secuencia") o de modo directo (o aleatorio, pudiendo acceder directamente a cualquier posición del fichero).
19.2. Acceso secuencial a un fichero
Primero veremos la forma de acceder a un fichero secuencial: abriremos un fichero para escritura y guardaremos texto en él; después lo cerraremos y lo volveremos a abrir, esta vez para lectura, y mostraremos en pantalla todo su contenido
REM Primero vamos a crear el fichero
OPEN "TEXTO.TXT" FOR OUTPUT AS #1
WRITE #1, "Esto es la primera linea del fichero"
WRITE #1, "Segunda línea"
WRITE #1, "Tercera y última línea"
CLOSE #1
REM Ahora vamos a leer del fichero
PRINT "Contenido del fichero:"
OPEN "TEXTO.TXT" FOR INPUT AS #1
DO WHILE NOT EOF(1)
LINE INPUT #1, linea$
PRINT linea$
LOOP
CLOSE #1
PRINT "Final del fichero"
(Fuente "1901.bas". Probado en QBasic 1.1)
Casi es autoexplicativo:
- Abrimos el fichero con OPEN, indicando el nombre de dicho fichero ("TEXTO.TXT"), si lo abrimos para escribir (FOR OUTPUT ) o para leer (FOR INPUT) y el número de fichero que le queremos asociar. En nuestro ejemplo, como es el único fichero que vamos a usar, le asignamos el número 1.
- Después escribimos datos en ese fichero (WRITE #1).
- Finalmente cerramos el fichero (CLOSE #1).
- En el caso de la lectura, leemos todo su contenido, hasta llegar al final del fichero 1 (WHILE NOT EOF(1)). Cada línea se leerá con la orden LINE INPUT (en nuestro caso, del fichero 1: LINE INPUT #1).
Cuando abrimos para escribir (FOR OUTPUT), si el fichero ya existiera, se borraría. Si queremos añadir en un fichero de texto que ya existe, en vez de crear uno nuevo, deberemos usar FOR APPEND, así:
OPEN "FICHERO2.TXT" FOR APPEND AS #3
Ejercicio propuesto 19.2.1: Crea un programa que pida frases al usuario y las guarde en un fichero de texto, cada frase en una línea.
Ejercicio propuesto 19.2.2: Crea un programa que pida al usuario el nombre de un fichero de texto y muestre todo su contenido en pantalla. Tras cada 24 líneas, deberá hacer una pausa hasta que el usuario pulse Intro.
Ejercicio propuesto 19.2.3: Crea un programa que pida al usuario el nombre de un fichero de texto y muestre en pantalla la cantidad de líneas de texto que contiene.
Ejercicio propuesto 19.2.4: Crea un programa que pida al usuario el nombre de un fichero de texto, cuente cuántas líneas contiene, cree un array y guarde todas ellas, para luego mostrarlas en pantalla en orden contrario (de la última a la primera).
Ejercicio propuesto 19.2.5: Crea un programa que pida al usuario el nombre de un fichero de texto, guarde todas sus líneas en un array y las vuelque a un nuevo fichero llamado "salida.txt", en orden contrario (de la última a la primera).
19.3. Acceso aleatorio a un fichero
Si queremos abrir el fichero para acceder directamente a cualquier " registro", tendremos que indicar que será de acceso directo.
Vamos a verlo con un ejemplo, en el que casi todo es ya conocido, salvo que cambia un poco la forma de abrir el fichero (se indica que es acceso aleatorio con FOR RANDOM, y se indica también la longitud de cada ficha), y que los datos se leen con GET y se escriben con PUT , indicando en cada caso el número de registro a leer o escribir.
REM Definimos el tipo de datos que vamos a almacenar
TYPE TipoAlumnos
nombre AS STRING * 30
edad AS INTEGER
nota AS SINGLE
END TYPE
REM Reservamos espacio en memoria para 20 alumnos
DIM Alumno(1 TO 20) AS TipoAlumnos
REM Y también para una ficha temporal
DIM AlumnoTemp AS TipoAlumnos
REM Abro el fichero y guardo 10 datos en él
OPEN "ALUMNOS.DAT" FOR RANDOM AS #1 LEN = LEN(TipoAlumnos)
FOR i = 1 TO 10
PUT #1, i, Alumno(i)
NEXT i
CLOSE #1
REM Ahora abro y leo la 5ª ficha
OPEN "ALUMNOS.DAT" FOR RANDOM AS #1 LEN = LEN(TipoAlumnos)
GET #1, 5, AlumnoTemp
PRINT "Nombre del alumno:", AlumnoTemp.nombre
PRINT "Nota del alumno:", AlumnoTemp.nota
CLOSE #1
(Fuente "1902.bas". Probado en QBasic 1.1)
Ejercicio propuesto 19.3.1: Crea una pequeña agenda, que permita guardar el nombre, la edad, el teléfono y el correo electrónico de hasta 200 amigos. Deberá mostrar un pequeño menú que permita añadir un nuevo dato o ver todos los existentes.
Ejercicio propuesto 19.3.2: Mejora la agenda (21.3.1) para que permita buscar personas que contengan un cierto texto.