Curso de Pascal. Tema 11: Manejo de ficheros.
Tema 11.3. Manejo de ficheros (3) - Ficheros con tipo.Hemos visto cómo acceder
a los ficheros de texto, tanto para leerlos como para escribir en ellos. Ahora nos centraremos en lo que vamos a llamar "ficheros con tipo".
Estos son ficheros en los que cada uno de los elementos que lo integran
es del mismo tipo (como vimos que ocurre en un array).
En los de, texto se podría considerar que estaban formados por
elementos iguales, de tipo "char", pero ahora vamos a llegar más
allá, porque un fichero formado por datos de tipo "record" sería
lo ideal para empezar a crear nuestra propia agenda.
Una vez que se conocen los ficheros de texto, no hay muchas diferencias
a la hora de un primer manejo: debemos declarar un fichero, asignarlo,
abrirlo, trabajar con él y cerrarlo.
Pero ahora podemos hacer más cosas
también. Con los de texto, el uso habitual era leer línea
por línea, no carácter por carácter. Como las
líneas pueden tener cualquier longitud, no podíamos empezar
por leer la línea 4 (por ejemplo), sin haber leído antes las
tres anteriores. Esto es lo que se llama ACCESO SECUENCIAL.
Ahora sí que sabemos lo que va a ocupar cada dato, ya que todos
son del mismo tipo, y podremos aprovecharlo para acceder a una determinada
posición del fichero cuando nos interese, sin necesidad de pasar
por todas las posiciones anteriores. Esto es el ACCESO ALEATORIO
(o directo).
La idea es sencilla: si cada ficha ocupa 25 bytes, y queremos leer la
número 8, bastaría con "saltarnos" 25*7=175 bytes.
Pero Turbo Pascal (y muchos de los compiladores que nacieron después de él,como Free Pascal) nos lo facilita más aún, con una orden,
seek,
que permite saltar a una determinada posición de un fichero sin
tener que calcular nada nosotros mismos. Veamos un par de ejemplos...
Primero vamos a introducir varias fichas en un fichero con tipo:
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Crea un fichero "con }
{ tipo" }
{ CREAFT.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Free Pascal 2.0.2 }
{--------------------------}
program IntroduceDatos;
type
ficha = record (* Nuestras fichas *)
nombre: string [80];
edad: byte
end;
var
fichero: file of ficha; (* Nuestro fichero *)
bucle: byte; (* Para bucles, claro *)
datoActual: ficha; (* La ficha actual *)
begin
assign( fichero, 'basura.dat' ); (* Asignamos *)
rewrite( fichero ); (* Abrimos (escritura) *)
writeln(' Te iré pidiendo los datos de cuatro personas...' );
for bucle := 1 to 4 do (* Repetimos 4 veces *)
begin
writeln(' Introduce el nombre de la persona número ', bucle);
readln( datoActual.nombre );
writeln(' Introduce la edad de la persona número ', bucle);
readln( datoActual.edad );
write( fichero, datoActual ); (* Guardamos el dato *)
end;
close( fichero ); (* Cerramos el fichero *)
end. (* Y se acabó *) Debería resultar fácil. La única diferencia con lo
que ya habíamos visto es que los datos son de tipo "record" y que
el fichero se declara de forma distinta, con "file of TipoBase".
Ahora vamos a ver cómo leeríamos sólo la
tercera ficha de este fichero de datos que acabamos de crear:
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Lee de un fichero }
{ "con tipo" }
{ LEEFT.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Free Pascal 2.0.2 }
{ - Turbo Pascal 5.0 }
{ - Surpas 1.00 }
{--------------------------}
program LeeUnDato;
type
ficha = record
nombre: string [80];
edad: byte
end;
var
fichero: file of ficha;
bucle: byte;
datoActual: ficha;
begin
assign( fichero, 'basura.dat' );
reset( fichero ); (* Abrimos (lectura) *)
seek( fichero, 2 ); (* <== Vamos a la ficha 3 *)
read( fichero, datoActual ); (* Leemos *)
writeln(' El nombre es: ', datoActual.nombre );
writeln(' La edad es: ',datoActual.edad );
close( fichero ); (* Y cerramos el fichero *)
end.
Espero que el listado sea autoexplicativo.
La única cosa que merece la pena comentar es eso del "seek(fichero,
2)": La posición de las fichas dentro de un fichero de empieza
a numerar en 0, que corresponderá a la primera posición.
Así, accederemos a la segunda posición con un 1, a la tercera
con un 2, y en general a la "n" con "seek(fichero,n-1)".
Y ya que como mejor se aprende es practicando, os propongo nuestra famosa
agenda:
En primer lugar va a ser una agenda que guarde una sola ficha en memoria
y que vaya leyendo cada ficha que nos interese desde el disco, o escribiendo
en él los nuevos datos (todo ello de forma "automática",
sin que quien maneje la agenda se de cuenta). Esto hace que sea más
lenta, pero no tiene más limitación de tamaño que
el espacio libre en nuestro disco duro. Las posibilidades que debe
tener serán:
- Mostrar la ficha actual en pantalla (automático también).
- Modificar la ficha actual.
- Añadir fichas nuevas.
- Salir del programa.
Más adelante ya le iremos introduciendo mejoras, como buscar,
ordenar, imprimir una o varias fichas, etc. El formato de cada ficha
será:
- Nombre: 20 letras.
- Dirección: 30 letras.
- Ciudad: 15 letras.
- Código Postal: 5 letras.
- Teléfono: 12 letras.
- Observaciones: 40 letras.
A ver quien se atreve con ello... 
|