miércoles, noviembre 08, 2006

CLASE DESARROLLADA EL DIA: LUNES 13 DE NOVIEMBRE PARA 5TO. "C" SECUNDARIA-COLEGIO CLARETIANO-TRUJILLO


B. ARCHIVOS CON TIPO:
Los archivos con tipo o tipificados son archivos que contienen datos de un tipo particular, tales como enteros, reales registros, etc. Estos archivos valiosos pueden hacer más fácil y más eficiente su programación. De hecho, los archivos con tipo, proporcionan entradas y salidas mucho más rápidas de las que hacen los archivos de texto.
A diferencia de los archivos de texto que no son estructurados, los archivos tipificados tienen una estructura rígida que depende, y se define, según el tipo de datos que ellos mantienen.

b.1 ESTRUCTURA DEL ARCHIVO:
La diferencia entre un archivo tipo texto y uno con tipo, radica en que el primero está compuesto de líneas de caracteres y el segundo se acomoda en registros con estructuras fijas. La longitud de los registros esta determinada por la cantidad de byte que se necesitan para almacenar el tipo de datos que contendrá el registro.

b.2 DECLARACIÓN DE UN ARCHIVO CON TIPO:
Para declarar un archivo con tipo se realiza con las palabras reservadas FILE OF, su sintaxis es la siguiente:

Var VariableArchivo:FILE OF TipoElementos;

Por Ejemplo:

Var F: FILE OF Integer,

En esta declaración le indica a Free Pascal que su archivo utilizará para almacenar solamente números enteros.

Var March: FILE OF Real;

En esta declaración le indica a Free Pascal que su archivo utilizará para almacenar solamente números reales.


Normalmente no se desea crear archivos que puedan almacenar un solo tipo de datos ya que se requerirían varios archivos, por ejemplo para alguna base de datos: uno para los nombres, otro para los apellidos, otro para la edad, etc. Para evitar este inconveniente es posible usar registros del tipo RECORD, que permiten grabar en un solo registro un grupo de datos que pueden ser de diferentes tipos, uno de tipo INTEGER, uno de tipo STRING, etc.

Los registros del tipo record deben ser declarados antes de las variables en una sección llamada TYPE.
La sección TYPE se escribe antes de la declaración de las variables.
Para crear la tabla de Personal, quedaría así:



Type
Personal=Record
Nombre:String[30];
Direccion:String[30];
Telefono:String[10];
Edad:Integer;
Area:String[12];
Sueldo:Real;
End;

El siguiente paso sería declarar un archive del tipo de Personal, así como una variable del mismo tipo de los que se utilizarán en el archivo.

VAR
Archivo: FILE OF Personal;
DatosPersonal: Personal;

b.3 ASIGNACIÓN DE UN ARCHIVO:
Sintaxis:
Assign (Archivo, ‘Nombre.ext’);

Nombre.ext puede ser una constante, una variable o estar escrita directamente en el programa. Naturalmente debe cumplir con todas las reglas para nombrar un archivo.

b.4 ABRIR ARCHIVOS:

En este caso de querer abrir un archivo, se pueden utilizar las funciones:
Reset: Permite abrir un archivo ya existente en el disco. En este tipo de archivos, esta función permite la lectura y la escritura.
Rewrite: Se comporta igual que con los archivos de texto. Si el archivo asignado ya existe se eliminará del disco toda la información y se creará uno nuevo.
Nota:
En estos tipos de archivos no se utiliza Append.

b.5 REGISTRO ACTUAL Y TAMAÑO DE UN ARCHIVO:
La función FILESIZE regresa el tamaño de un archivo, o mejor dicho devuelve el número de registros contenidos en éste. Al momento de abrir un archivo nuevo la función FILESIZE regresa el valor de 0, lo que significa que el archivo no tiene datos guardados en él.

Sintaxis:

FileSize(VariableArchivo);

b.6 POSICIONAMIENTO EN UN REGISTRO DETERMINADO:
Cada uno de los registros de un archivo esta referenciado por un número específico comenzando desde el registro 0 y aumentando de 1 en 1.
La función FILEPOS devuelve el número del registro actual.

Sintaxis:
FILEPOS(VariableArchivo);

Entre otras funciones útiles tenemos:

Función Seek:
Se utiliza para moverse a un registro determinado con la siguiente sintaxis:

Seek(VariableArchivo,FileSize(VariableArchivo));

Cuando se avanza en un archivo registro por registro se utiliza la función EOF( ) para determinar si ya se llegó al final del archivo.

b.7 LECTURA Y ESCRITURA DE ARCHIVOS:

Para lectura y escritura en un archivo con tipo se utilizan los procedimientos Read y Write. Después de cada operación de lectura o escritura el puntero se posiciona en el siguiente registro. Para estar seguros de que se leerá el registro que se desea se debe emplear el procedimiento Seek antes de cualquier procedimiento de lectura o escritura.

b.8 CERRAR UN ARCHIVO:

Para cerrar los archivos abiertos se procede igual que en uni de tipo texto, utilizando el procedimiento CLOSE.
Sintaxis:

CLOSE(VariableArchivo);

Ejemplo 1: Escribe los datos de un registro en un archivo.

Program EscribirunArchivoConTipo;
Uses Crt, SysUtils;
Const
NomArchivo=’/root/agenda.dat’;
Type
TAgenda=Record
Nombre:String[30];
Direc:String[30];
Telef:String[12];
Email:String[30];
Edad:Integer;
End;
Var
ArchAgenda: File Of TAgenda;
DatAgenda:Tagenda;
Num,i:Integer;
Begin
Assign(ArchAgenda,NomArchivo);
If not FileExists(NomArchivo) Then
Rewrite(ArchAgenda)
Else
Reset(ArchAgenda);
Write(‘Cuantos registros desea ingresar a la agenda: ‘);
Readln(Num);
For I:=1 to Num Do
Begin
Write(‘Introduzca el Nombre: ‘);Readln(DatAgenda.Nombre);
Write(‘Introduzca la Dirección: ‘);Readln(DatAgenda.Direc);
Write(‘Introduzca el Telefono: ‘);Readln(DatAgenda.Telef);
Write(‘Introduzca su dirección electronica: ‘);Readln(DatAgenda.Email);
Write(‘Introduzca su Edad: ‘);Readln(DatAgenda.Edad);
Write(ArchAgenda,DatAgenda);
Writeln;
End;
Close(ArchAgenda);
Readkey
End.

Ejemplo 2: Lectura de los datos del archive del ejemplo 1

Program LeerunArchivoConTipo;
Uses Crt, SysUtils;
Const
NomArchivo=’/root/agenda.dat’;
Type
TAgenda=Record
Nombre:String[30];
Direc:String[30];
Telef:String[12];
Email:String[30];
Edad:Integer;
End;
Var
ArchAgenda:File Of TAgenda;
DatAgenda:Tagenda;
i:Integer;
Begin
Assign(ArchAgenda,NomArchivo);
If not FileExists(NomArchivo) Then
Writeln(‘El Archivo ‘,NomArchivo,’ No existe’)
Else
Begin
Reset(ArchAgenda);
For I:=1 to FileSize(ArchAgenda) Do
Begin
Read(ArchAgenda,DatAgenda);
Writeln(‘Nombre: ‘,DatAgenda.Nombre);
Writeln(‘ Dirección: ‘,DatAgenda.Direc);
Writeln(‘Telefono: ‘,DatAgenda.Telef);
Writeln(‘Email: ‘,DatAgenda.Email);
Writeln(‘Edad: ‘, DatAgenda.Edad);
Writeln;
End;
Close(ArchAgenda);
End;
Readkey
End.

Ejemplo: 3: Para leer el archive en sentido inverso al habitual, puesto que Read adelanta el cursor de lectura automáticamente que vamos leyendo, necesitamos la función SEEK.


Program LeerunArchivoConTipoAlreves;
Uses Crt, SysUtils;
Const
NomArchivo=’/root/agenda.dat’;
Type
TAgenda=Record
Nombre:String[30];
Direc:String[30];
Telef:String[12];
Email:String[30];
Edad:Integer;
End;
Var
ArchAgenda:File Of TAgenda;
DatAgenda:Tagenda;
i:Integer;
Begin
Assign(ArchAgenda,NomArchivo);
If not FileExists(NomArchivo) Then
Writeln(‘El Archivo ‘,NomArchivo,’ No existe’)
Else
Begin
Reset(ArchAgenda);
For I:=1 to FileSize(ArchAgenda)-1 downto 0 Do
Begin
Seek(Agenda,i);
Read(ArchAgenda,DatAgenda);
Writeln(‘Nombre: ‘,DatAgenda.Nombre);
Writeln(‘ Dirección: ‘,DatAgenda.Direc);
Writeln(‘Telefono: ‘,DatAgenda.Telef);
Writeln(‘Email: ‘,DatAgenda.Email);
Writeln(‘Edad: ‘, DatAgenda.Edad);
Writeln;
End;
Close(ArchAgenda);
End;
Readkey
End.