Ficheros uniformes.
Introducción
Un fichero uniforme es una secuencia arbitrariamente
larga de elementos del mismo tipo. En Ada se distinguen ficheros secuenciales
y ficheros de acceso directo. (Un fichero de texto es básicamente
un fichero secuencial de caracteres).
Cláusula de contexto
Los elementos necesarios para manejar ficheros secuenciales
se encuentran en el paquete "Sequential_IO", los ficheros de acceso directo
se manejan con el paquete "Direct_IO" que habrá que incluir en la
cláusula de contexto.
with Text_IO,Sequential_IO,Direct_IO;
use Text_IO;
Declaración
Para poder usar ficheros uniformes se ha de definir
previamente el tipo de sus componentes (a menos que sea de un tipo predefinido)
type TPersona is
record
Nombre : string(1..20);
DNI : string(1..10);
Edad : natural;
end record;
Una vez definido el tipo, se han de definir instancias
de los paquetes de manejo de ficheros, según el tipo de acceso que
se vaya a utilizar.
package FichTPersona_Sec
is
new Sequential_IO(TPersona); -- Acceso secuencial
package FichTPersona_Dir
is
new Direct_IO(TPersona); -- Acceso directo
use FichTPersona_Sec,FichTPersona_Dir;
Ahora se pueden declarar variables de tipo fichero
directo o secuencial:
Fichero1 : FichTPersona_Sec.File_Type;
Fichero2 : FichTPersona_Dir.File_Type;
Apertura
Antes de poder hacer transacciones con una variable
fichero debe asociarse con un fichero externo; esto se puede hacer con
los procedimientos: "Create" y "Open". El primero sirve para crear un fichero
y el segundo para abrir un fichero que ya existe.
procedure Create (File
: in out File_Type;
Mode : in File_Mode := Out_File; --InOut_File
en acceso directo
Name : in String := "";
Form : in String := "");
procedure
Open (File : in out File_Type;
Mode : in File_Mode;
Name : in String;
Form : in String := "");
-
File es la variable fichero (fichero lógico).
-
Mode es el modo de apertura (puede tomar los valores: "In_File",
"Out_File", "Append_File", "InOut_File").
-
In_File abre el fichero en modo lectura.
-
Out_File abre el fichero en modo escritura (si el fichero ya existe,
se vacía).
-
Append_File abre un fichero secuencial en modo escritura
para añadir información al final.
-
InOut_File abre un fichero de acceso directo, permitiendo
realizar lecturas y escrituras.
-
Name es el nombre del fichero externo (no aparecerá en ningún
otro sitio del programa).
-
Form no se usa generalmente; es un parámetro que depende
del sistema y puede servir para cosas como proteger el fichero con una
password.
Create(Fichero1,Name => "C:\TEMP\unfichero.dat");
Open(Fichero2,InOut_File,"C:\TEMP\otrofichero.dat");
En el ejemplo, la primera sentencia crea y abre
en modo escritura un fichero secuencial externo llamado "C:\TEMP\unfichero.dat"
y lo asocia con la variable "Fichero1". La segunda sentencia abre en modo
lectura/escritura un fichero externo de acceso directo llamado "C:\TEMP\otrofichero.dat"
y lo asocia con la variable "Fichero2".
Los errores que pudieran producirse al intentar
abrir un fichero pueden controlarse mediante excepciones.
Existe una función para ver si un fichero
está abierto:
function Is_Open(File
: in File_Type) return Boolean;
Por ejemplo: "Is_Open(Fichero1)" devuelve True si
el fichero "Fichero1" está abierto y "False", si no.
Existen funciones similares para obtener el modo
de apertura y nombre de un fichero abierto.
function Mode
(File : in File_Type) return File_Mode;
function Name
(File : in File_Type) return String;
Cierre
Una vez que se ha terminado de trabajar con un fichero
se debe cerrar con la operación "Close".
procedure Close (File
: in out File_Type);
Close(Fichero1); --cierra Fichero1
Transferencia de información
Para realizar lecturas y escrituras desde/a ficheros
se han de declarar previamente variables del tipo de los componentes del
fichero.
Persona_1,Persona_2,Persona_3
: TPersona;
Las operaciones de entrada/salida se realizan con
las operaciones "Read" y "Write".
procedure Read(File : in
out File_Type; Item : out Element_Type;
From : in Positive_Count);
procedure Read(File : in
out File_Type; Item : out Element_Type);
Read lee un elemento de un fichero y avanza una posición:
-
File es la variable fichero.
-
Item es la variable, del tipo de los componentes del fichero, en
la que se lee el elemento.
-
From es la posición en el fichero desde donde se quiere leer
el dato. Sólo es aplicable a ficheros de acceso directo. Si no se
especifica se lee de la posición actual en el fichero.
procedure Write(File : in
out File_Type; Item : in Element_Type;
To : in Positive_Count);
procedure Write(File :
in
out File_Type; Item : in Element_Type);
Write escribe un elemento en un fichero y avanza
una posición:
-
File es la variable fichero.
-
Item es la variable, del tipo de los componentes del fichero, cuyo
contenido se escribe en el fichero
-
To es la posición en el fichero donde se quiere escribir
el dato. Sólo es aplicable a ficheros de acceso directo. Si no se
especifica se escribe en la posición actual en el fichero.
Estructura del fichero
Existe una operación para controlar la marca
de fin de fichero:
-
End_Of_File(Fichero1) es una función
que devuelve True si se ha alcanzado el final de Fichero1 y False en caso
contrario.
Operaciones con ficheros de acceso directo
El tamaño, en número de componentes, de
un fichero de acceso directo se obtiene mediante la función "Size",
que devuelve un número comprendido entre 0 y el máximo tamaño
posible definido en la implementación del compilador de Ada que
se esté usando.
function Size(File : in
File_Type) return Count;
Se puede saltar a una posición específica
de un fichero utilizando el procedimiento "Set_Index"
procedure Set_Index(File
: in out File_Type; To : in Positive_Count);
La posición actual en el fichero se puede
averiguar mediante la función "Index", que devuelve un valor comprendido
entre 1 y el máximo tamaño posible definido en la implementación.
function Index(File : in
File_Type) return Positive_Count;
Eliminación de un fichero externo
Se realiza mediante la operación "Delete".
procedure Delete
(File : in out File_Type);
"Delete" borra el fichero externo asociado con la
variable fichero que se le pase y cierra ésta.
Además...
En los anexos A.7, A.8 y A.9 del "Ada 95 reference
manual" incluido en la ayuda de ObjectAda 7.1 se puede encontrar más
información sobre manipulación de ficheros.
[Anterior][Inicio][Siguiente]