El documento describe varios conceptos relacionados con el procesamiento de archivos en Ada, incluyendo:
1) La creación, apertura y cierre de archivos secuenciales, así como las operaciones de lectura y escritura en ellos.
2) El uso de paquetes como Sequential_IO y tipos de datos registros para manejar archivos.
3) Funciones como End_Of_File, Is_Open y Name para controlar archivos.
4) Ejemplos de código Ada que ilustran cómo crear, leer y escribir en archivos secuencial
2. Procesos
Apareo de archivos (mezclarlos respetando el orden).
Consiste en intercalar información de dos o más archivos, donde cada uno debe estar
ordenado previamente en el mismo orden y bajo la misma clave.
ABM de archivos (Altas, Bajas y Modificaciones de información en un archivo).
Los tipos de archivos que estamos estudiando son una fuente de información, y como tal,
necesitamos mantenerla actualizada. La actualización implica agregar, borrar o modificar la
información que se encuentra en un archivo.
Ordenamiento de un archivo, Búsqueda.
Para ordenar un archivo lo “bajamos” a memoria, a un vector de registros, lo ordenamos
como se ordena un vector de registros, y luego lo “subimos” a disco. Las búsquedas se
pueden realizar sobre el dispositivo, o más rápidamente en la memoria.
Algorítmica y Programación I
3. Apareo de Archivos
Veremos este modelo de procesamiento al estudiar en la próxima clase
los cortes de control.
Archivo
Maestro Archivo de
Detalles
Impresión 1
Algorítmica y Programación I
4. Archivo1 Archivo2 Archivon
…………
Archivo=Archivo1 U Archivo2 U ……
Archivon
Algorítmica y Programación I
12. Nosotros restringiremos nuestro estudio a los archivos secuenciales, de los que a
continuación veremos la sintaxis y requisitos formales para su aplicación:
Los elementos necesarios para manejar archivos secuenciales se encuentran en el
paquete "Sequential_IO".
with Ada.Sequential_IO;
Declaración
Para poder usar archivos secuenciales se deben definir previamente el tipo de sus
componentes
type TPersona is
record
Nombre : string(1..20);
DNI : string(1..10);
Edad : natural;
end record;
Una vez definido el tipo, se definen instancias de los paquetes de manejo de
archivos, según el tipo de acceso que se vaya a utilizar.
package ArchTPersona_Sec is new Ada.Sequential_IO(TPersona); - - Acceso
secuencial
use ArchTPersona_Sec; Algorítmica y Programación I
13. Ahora se pueden declarar variables de tipo archivo secuencial:
MiArchivo : ArchTPersona_Sec.tipo_archivo;
Creación de archivo secuencial
Create ( File => <nombre de variable >, Mode => Out_File, -- por defecto
Name => "<nombre de archivo externo>" );
<nombre de variable > -- el nombre de la variable archivo
<external file name> - - el nombre del archivo externo (físico).
Ejemplo :
Create ( File => MiArchivo,
Mode => Out_File,
Name => "c: MiArchivo.dat" );
Algorítmica y Programación I
14. Apertura de archivo secuencial
Open ( File => <nombre de variable >, Mode => In_File, Name => "<nombre
de archivo externo>" );
<nombre de variable > - el nombre de la variable archivo
<external file name> - el nombre del archivo externo (físico).
Ejemplo :
Open ( File => MiArchivo,
Mode => In_File,
Name => "c: MiArchivo.dat" );
• Mode es el modo de apertura (puede tomar los valores: "In_File",
"Out_File", "Append_File").
• In_File abre el archivo en modo lectura.
• Out_File abre el archivo en modo escritura (si el fichero ya existe,
se vacía).
• Append_File abre un archivo secuencial en modo escritura para
añadir información al final.
Algorítmica y Programación I
15. Cierre de archivo secuencial
Close ( File => < nombre de variable > );
<nombre de variable> - el nombre de la variable archivo.
Ejemplo :
Close ( File => MiArchivo);
Operaciones de entrada/salida : Read y Write
Read( File => < nombre de variable >, Item => < nombre componente>);
<nombre de variable> - es el nombre de la variable archivo.
< nombre componente> Nombre del componente del archivo que se lee
desde éste.
Write( File => < nombre de variable >, Item => < nombre componente>);
<nombre de variable> - es el nombre de la variable archivo.
< nombre componente> Nombre del componente del archivo que se graba
en éste.
Algorítmica y Programación I
16. Otras funciones
End_Of_File(Archivo1) es una función que devuelve True si se ha alcanzado el final de
Archivo1 y False en caso contrario.
Is_Open(Archivo1) devuelve True si el archivo "Archivo1" está abierto y "False" en
caso contrario.
Mode(Archivo1) devuelve el modo en que ha sido abierto el archivo.
Name(Archivo1) devuelve el nombre del archivo externo correspondiente a “Archivo1”
(nombre lógico).
Los errores que pudieran producirse al intentar abrir un archivo pueden controlarse
mediante excepciones.
Algorítmica y Programación I
17. with ada.Text_Io,ada.Sequential_IO, ada.characters.handling, ada.Integer_Text_IO;
use ada.Text_Io, ada.characters.handling, ada.Integer_Text_IO;
procedure crear_Fichero is
subtype Cadena20 is String(1..20);
subtype Cadena8 is String(1..8);
type T_Persona is
record
Nombre: cadena20 ;
Dni: cadena8;
Edad: Natural;
end record;
package Archi_Persona_Sec is new ada.Sequential_Io(T_Persona);
use Archi_Persona_Sec;
F_Entrada: Archi_persona_sec.File_Type;
Alumno:T_Persona;
sigue:character;
begin
--se abren los ficheros
Create(F_Entrada,Out_File, "F:alumnos.dat");
loop
carga_registro(alumno); - - en este procedimiento se genera el registro alumno
Get_Immediate(Sigue);
sigue:=to_upper(sigue);
Write(F_Entrada, Alumno); - - se graba el registro alumnos en el archivo F_Entrada
exit when sigue/='C';
end loop;
Close(F_Entrada); --se cierran los ficheros
end crear_Fichero;
Algorítmica y Programación I
18. with ada.Text_Io,ada.Sequential_IO;
with ada.Text_Io , ada.Integer_Text_IO;
use ada.Text_Io, ada.Integer_Text_IO;
procedure leo_Fichero is
subtype Cadena20 is String(1..20);
subtype Cadena8 is String(1..8);
type T_Persona is
record
Nombre: cadena20 ;
Dni: cadena8;
Edad: Natural;
end record;
package Archi_Persona_Sec is new ada.Sequential_Io(T_Persona);
use Archi_Persona_Sec;
F_Entrada: Archi_persona_sec.File_Type;
Alumno:T_Persona;
begin
Archi_persona_sec.Open(F_Entrada,In_File, "F:alumnos.dat"); - - se abren los ficheros
loop exit when Archi_Persona_Sec.End_Of_File(F_Entrada); - - esto equivale a mientras no fin archivo
archi_persona_sec.Read(F_Entrada, Alumno);
Put_line("El Nombre y Apellido es ");
Put_line(alumno.nombre);
Put_Line("Su DNI");
put_line(alumno.dni);
Put_line("Su edad ");
Put(Alumno.Edad);
new_line;
end loop;
archi_persona_sec.Close(F_Entrada); - -se cierran los ficheros
end leo_Fichero; Algorítmica y Programación I
19. -- este programa copia un archivo de texto en otro
with Text_Io;
use Text_Io;
-- El procedimiento Copiar_Fichero copia un fichero de texto
-- llamado "original.txt" en otro llamado "copia.txt"
-- precondiciones: debe existir un fichero externo llamado original.txt
-- no debe existir un fichero externo llamado copia.txt
-- postcondiciones: Existe un fichero externo llamado "copia.txt" cuyo contenido es
-- idéntico al de "original.txt"
procedure Copiar_Fichero_ok is
F_Entrada, F_Salida: File_Type;
Línea : String(1..200);
Lon_Línea : Natural;
begin
--se abren los ficheros
Open(F_Entrada,Mode => In_File,Name => "C:original.txt");
Create(F_Salida,Name => "C:copia.txt");
--se copia F_Entrada en F_Salida
while not End_Of_File(F_Entrada) loop
Get_Line(F_Entrada,Línea,Lon_Línea);
Put_Line(F_Salida,Línea(1..Lon_Línea));
end loop;
--se cierran los ficheros
Close(F_Entrada);
Close(F_Salida);
end Copiar_Fichero_ok; Algorítmica y Programación I
20. En la próxima clase veremos Cortes de Control ………
Algorítmica y Programación I