En este artículo el autor describe como se crean
y utilizan en Delphi los
ficheros de datos en formato ASCII y en
formato binario.
El procesamiento de
datos implica con frecuencia el almacenamiento y
manipulación de estos en ficheros, término que hace
referencia a una colección de datos del mismo tipo que
pueden ser almacenados en un dispositivo auxiliar de
almacenamiento y a los que podemos acceder cuando sea
necesario.
En Delphi los ficheros pueden ser de dos tipos: ficheros
en formato ASCII o ficheros en formato binario y pueden, a su
vez, organizarse de dos formas diferentes: en forma secuencial o
en forma indexada. En un fichero secuencial todos los componentes
del fichero se almacenan secuencialmente uno después del
otro.
En este trabajo se
aborda cómo se crean y utilizan en Delhi tanto los
ficheros en formato ASCII como en formato binario organizados
secuencialmente, ya que para almacenar datos con estructura
indexada es mucho más cómodo hacerlo usando
bases de
datos, las cuales Delphi maneja a la
perfección.
Ficheros en formato ASCII.
Los ficheros en formato ASCII son los más
sencillos de todos. Se pueden visualizar con el Bloc de Notas de
Windows y
suelen llevar extensión txt.
Un fichero de este tipo puede definirse
fácilmente declarando al identificador que lo representa
de tipo texto. Esta
declaración puede expresarse como:
Var Nombre del fichero : TextFile
Para leer o escribir datos en un fichero con formato
ASCII se deben dar los siguientes pasos:
- Indicarle a Delphi que se trata de un fichero de tipo
texto. - Declarar las variables
que se usarán para leer o escribir datos en el fichero.
Estas variables deben ser de tipo String ya que se trata de un
fichero en formato ASCII. - Indicarle a Delphi como se llama el fichero y con que
nombre se conocerá en el programa para
lo cual se emplea la función
AssignFile. - Se abre el fichero en el modo en el que se desea
trabajar:
- Modo lectura. Se
indica con la orden Reset. - Modo escritura
para añadir datos. Se indica con la orden
Append. - Modo reescritura para crear el fichero y si este
existía con anterioridad sobrescribirlo. Se indica con
la orden Rewrite.
- Cerrar el fichero una vez concluido el proceso de
lectura o escritura. Se indica con la orden
CloseFile.
Ejemplo:
Los siguientes procedimientos
permiten crear el fichero Grupo,
almacenar en él los nombres de los estudiantes que lo
integran y recuperar luego el listado.
Procedure CrearFichero;
Var
Datos : TextFile;
begin
AssignFile (Datos, 'Grupo.txt');
Rewrite (Datos);
CloseFile (Datos);
end;
Procedure EscribirDatos (Nombre : String);
Var
Datos : TextFile;
begin
AssignFile (Datos, 'Grupo.txt');
Append (Datos);
Writeln (Datos, Nombre);
CloseFile (Datos);
end;
Procedure LeerDatos;
Var
Datos : TextFile;
I : Integer;
begin
AssignFile (Datos, 'Grupo.txt');
Reset (Datos);
I := 1;
While Not Eof (Datos) do
begin
Readln (Datos, Nombre[I]);
Inc (I);
end;
CloseFile (Datos);
end;
Antes de usarlos, declare el arreglo Nombre de tipo
String.
La función Eof permite conocer si se llegó
o no al final del fichero respondiendo True en caso positivo y
False en caso contrario.
Para conocer el número de registros que
existen en un fichero, se puede utilizar la siguiente
función:
Function ContarRegistros : Integer;
Var
Cantidad : Integer;
Datos : TextFile;
Linea : String;
begin
Cantidad := 0;
AssignFile (Datos, 'Grupo.txt');
Reset (Datos);
While Not Eof (Datos) do
begin
Readln (Datos, Linea);
Inc (Cantidad);
end;
CloseFile (Datos);
ContarRegistros := Cantidad;
end;
Ficheros en formato binario.
Los ficheros en formato binario solo pueden ser
leídos por el programa que los creó o por uno que
se programe para leerlos. La manera más sencilla de
definirlos es incluir la definición del fichero como parte
de una declaración de variable de tipo fichero. La forma
general de esta declaración es:
Var Nombre del fichero : File of tipo
donde tipo se refiere al tipo de dato de los componentes
individuales del fichero.
La ventaja con respecto a los ficheros en formato ASCII
es que se puede contar con dos funciones que no
existían en estos: FileSize y FilePos.
La primera de ellas retorna el número de
registros que existen en el fichero y la segunda la
posición actual del puntero dentro del fichero.
Los componentes individuales del fichero pueden ser de
tipo simple o de tipo estructurado. En este último caso se
debe declarar primero la estructura de
datos y luego indicarle al fichero que use esa
estructura.
Ejemplo:
Los siguientes procedimientos permiten crear el fichero
Información, almacenar en él el
nombre y el número del carné de identidad de
un grupo de estudiantes y luego recuperar esa
información.
Procedure CrearFichero;
Var
Datos : File of TListado;
begin
AssignFile (Datos,
‘Informacion.fic’);
Rewrite (Datos);
CloseFile (Datos);
end;
Procedure EscribirDatos (NuevaInformacion :
TListado);
Var
Datos : File of TListado;
begin
AssignFile (Datos, ‘Informacion.
fic’);
Reset (Datos);
Seek (Datos,FileSize (Datos));
Write (Datos, NuevaInformacion);
CloseFile (Datos);
end;
Procedure LeerDatos;
Var
Datos : File of TListado;
I : Integer;
begin
AssignFile (Datos, ‘Informacion.
fic’);
Reset (Datos);
For I := 1 to FileSize (Datos) do
Read (Datos, Listado [I]);
CloseFile (Datos);
end;
Antes de usarlos declare el tipo de dato
TListado.
Type
TListado = Record
Nombre : String [50];
NumeroIdentidad : Real;
end;
y la variable Listado como un arreglo de tipo
Tlistado.
La función Seek permite recorrer el fichero
avanzando el puntero dentro del mismo.
Para copiar el contenido de un fichero en otro, se puede
utilizar el siguiente procedimiento:
Procedure CopiarFichero;
Var
FicheroOrigen, FicheroDestino : File of
TListado;
Contenido : TListado;
begin
AssignFile (FicheroOrigen,
‘Informacion.fic');
Reset (FicheroOrigen);
AssignFile (FicheroDestino, 'Copia.fic');
Rewrite (FicheroDestino);
While Not Eof (FicheroOrigen) do
begin
Read (FicheroOrigen, Contenido);
Write (FicheroDestino, Contenido);
end;
CloseFile (FicheroOrigen);
CloseFile(FicheroDestino);
end;
se puede adaptar el procedimiento anterior para que solo
copie parte del contenido, estableciendo antes de la
instrucción Write el criterio de
validación.
Ejemplo:
Para copiar solo los que nacieron en el año 1990,
el criterio de validación podría ser:
If Copy (FloatToStr (Contenido.NumeroIdentidad),1,2) =
'90' then
por lo que el bloque While quedaría:
While Not Eof (FicheroOrigen) do
begin
Read (FicheroOrigen, Contenido);
If Copy (FloatToStr (Contenido.NumeroIdentidad),1,2) =
'90' then
Write (FicheroDestino, Contenido);
end;
Otra función útil en el manejo de ficheros
es la función FileExists con la que es posible conocer si
un fichero determinado existe o no.
La utilización de ficheros de datos facilita el
intercambio de información entre programas por lo
que puede ser una buena opción para la entrada y salida de
la información en nuestras aplicaciones.
Gottfried, Byron S. Programación en Pascal.– Ciudad
de la Habana : Editorial Pueblo y Educación,
1989
Katrib Mora, Miguel. Lenguajes de
programación y Técnicas
de compilación.– Ciudad de la Habana : Editorial Pueblo y
Educación, 1988
Curso por correo
electrónico sobre Borland Delphi.
Autor:
Asistente Juan Antonio Fonseca
Hernández