lunes, noviembre 27, 2006

CLASE DESARROLLADA EL 29/11 CON 5TO. "C" COLEGIO CLARETIANO-TRUJILLO

C) ARCHIVOS SIN TIPO O NO TIPIFICADOS:
Los archivos sin tipo o no tipificados no tienen ningún formato especial y por tanto podemos leer de ellos los datos que queramos. Hay que tener en cuenta, que en ninguno de los tres tipos de archivos se hace ningún tipo de comprobación de los datos que se escriben o se leen.
De forma que si abrimos un archivo de un tipo determinado, por ejemplo de tipo LongInt, con un alias de tipo Byte los datos que leamos corresponderán a los bytes del LongInt.
Los archivos sin tipo o no tipificados no hacen suposiciones sobre la estructura de datos. Se pueden leer datos desde un archivo no tipificado con cualquier tipo de dato.
Ya que Free Pascal no hace suposiciones sobre la forma de los datos, la transferencia desde el disco a la estructura de datos es inmediata. Estos es porque los archivos no tipificados se utilizan para aplicaciones que requieren entradas y salidas a alta velocidad.
Las funciones Write y Read no se pueden emplear con archivos sin tipo. Es por este motivo que tenemos que emplear las funciones BlockWrite y BlockRead. Estas funciones leen o escriben un número n, o menos en caso de lectura, de bloques de tamaño b, en bytes, que conviene especificar en las funciones Rewrite y Reset. Si no especificamos el valor del bloque a Rewrite o Reset por defecto vale 128 bytes.-
Ejemplo 1:
Programa en el cual escribiremos datos de tipo String y Entero.

Program EscrituradatosArchivosintipo;
Uses Crt, SysUtils;
Const
Nomarch=’/root/datos.dat’;
Var
Datos: File;
Nombres:String[35];
Telef:String[10];
Email:String[25];
Edad:Integer;
Begin
Clrscr;
(*Asignaremos o relacionamos la variable de tipo archivo con el archivo de disco*)
Assign(Datos,Nomarch);
(*Abrimos y creamos el archivo, especificando 1 byte como tamaño del bloque por comodidad*)
Rewrite(Datos,1);
Write(‘Nombres y Apellidos: ´);Readln(Nombres);
Write(‘Nro. Telefonico: ´); Readln(Telef);
Write(‘Correo Electronico: ´);Readln(Email);
Write(‘Edad : ´);Readln(Edad);
(*Ahora escribiremos o guardaremos los datos en el disco*)
BlockWrite(Datos,Nombres,SizeOf(Nombres));
BlockWrite(Datos,Telef,SizeOf(Telef));
BlockWrite(Datos,Email,SizeOf(Email));
BlockWrite(Datos,Edad,SizeOf(Edad));
(*Ahora cerraremos el archivo*)
Close(Datos);
Readkey;
End.

Observese:

- Que especificamos el tamaño del registro en 1 ya que después necesitaremos especificar el tamaño de los datos que vamos a escribir. Para esto empleamos la función SizeOf que toma como parámetro cualquier tipo de variable y devuelve su tamaño en bytes. Si no hubieramos especificado el tamaño del bloque, se tomaría por defecto 128 bytes.
- La función BlockWrite admite cualquier tipo de variable como segundo parámetro.
- Para leer, la función BlockRead funciona de forma parecida a BlockWrite. En este caso el segundo parámetro también puede ser de cualquier tipo, pero no una constante.

Ejemplo 2:
Programa en el cual leeremos datos de tipo String y Entero escritos en el programa del ejemplo 1.

Program LeerdatosArchivosintipo;
Uses Crt, SysUtils;
Const
Nomarch=’/root/datos.dat’;
Var
Datos: File;
Nombres:String[35];
Telef:String[10];
Email:String[25];
Edad:Integer;
Begin
Clrscr;
(*Asignaremos o relacionamos la variable de tipo archivo con el archivo de disco*)
Assign(Datos,Nomarch);
(*Abrimos el archivo, especificando 1 byte como tamaño del bloque por comodidad*)
Reset(Datos,1);
(*Ahora leeremos todos los datos del Archivo*)
While Not Eof(Datos) do
Begin
BlockRead(Datos,Nombres,SizeOf(Nombres));
BlockRead(Datos,Telef,SizeOf(Telef));
BlockRead(Datos,Email,SizeOf(Email));
BlockRead(Datos,Edad,SizeOf(Edad));
Writeln(‘Registro # : ‘,filepos(datos));
Writeln(‘Nombres y Apellidos: ´,Nombres);
Writeln(‘Nro. Telefonico: ´,Telef);
Writeln(‘Correo Electronico: ´,Email);
Writeln(‘Edad : ´,Edad);
Writeln;
End;
(*Ahora cerraremos el archivo*)
Close(Datos);
Readkey;
End.

Nota: Otras funciones que podemos emplear para los archivos sin tipo incluyen: FileSize, FilePos y Seek. Todas estas tres funciones trabajan con el valor del bloque, el tamaño del cual hemos especificado en Reset o Rewrite. También podemos emplear EOF para detectar el fin de archivo.


GESTIÓN DE ARCHIVOS


A diferencia de cerrar archivos, escribir o leer datos también podemos realizar otras operaciones como pueden ser eliminar un archivo o cambiar el nombre.

A) Eliminar un Archivo: Función Erase
Eliminar es tan simple como emplear la función Erase y el alias del archivo.
Hay que tener en cuenta de que el archivo tiene que estar cerrado para evitar un error en tiempo de ejecución. Además, cerrar un archivo ya cerrado da error de ejecución. Para asegurarse de que un archivo está cerrado podemos abrirlo con Reset y cerrarlo con Close. Nuevas llamadas a Reset con un archivo ya abierto no dan error, simplemente sitúan el cursor del archivo al inicio. Una vez que el archivo está cerrado ya podemos llamar a Erase.

Sintaxis:
Erase(VarArchivo);
Ejemplo:
…..
Var Datos:File;
Begin
Assign(Datos,’Data.dat’);
Erase(Datos);
…..

B) Renombrar un Archivo: Función Rename
La función Rename permite renombarr un archivo. Hay que tener en cuenta de que el archivo también tiene que estar cerrado.

Sintaxis:
Rename(VarArchivo,’NuevoNombredelArchivo’);

Ejemplo:
…..
Var Datos:File;
Begin
Assign(Datos,’Data.dat’);
Rename(Datos,’Datanueva.Dat’);
…..
Ejemplo:
El siguiente programa proporciona un método simple para renombrar y borrar archivos. Cuando comience el programa se le presentarán tres opciones: renombrar un archivo, borrar un archivo o dejarlo.

Program RenombrarBorrar;
Uses Crt, SysUtils;
Var
F: File;
Nombre1,Nombre2:String;
Opcion:Char;
Begin
Repeat
Clrscr;
Write(‘[R]enombrar, [B]orrar, [S]alir : ‘);
Readln(opcion);
Case Upcase(opcion) Of
‘R’:Begin
Write(‘Nombre del archivo a renombrar: ‘);
Readln(Nombre1);
Write(‘Nuevo nombre para el archivo : ‘);
Readln(Nombre2);
Assign(F,Nombre1);
Rename(F,Nombre2);
End;
‘B’:Begin
Write(‘Nombre del archivo a borrar: ‘);
Readln(Nombre1);
Assign(F,Nombre1);
Erase(F);
End;
End;
Readkey;
End.


CAPTURAR ERRORES DE ARCHIVOS CON IOResult

Hasta ahora hemos operado con archivos suponiendo que el archivo existía o bien no había ningún error durante las operaciones de lectura o de escritura. Existe una forma muy sencilla de capturar los errores de las operaciones con archivos mediante la variable IOResult y la directiva de compilador {$I}. Una directiva de compilador es un comentario que justo después de la llave hay el símbolo de dólar $ y una o más letras. Las directivas modifican el comportamiento del compilador en tiempo de compilación. Después de una directiva el compilador puede modificar su comportamiento de muchas formas. Muchas veces van asociadas a la llamada compilación condicional, que veremos más adelante, en otras se refiere a como se estructuran los datos, etc.
En el caso de $I es una directiva de activación/desactivación. Por defecto $I está activada con lo cual los errores de entrada/salida de archivos provocan un error de ejecución (runtime error). Los errores runtime son irrecuperables, o sea, provocan la finalización inmediata y anormal del programa
Muy a menudo, el error puede ser debido al usuario con lo cual hay que procurar de no generar un error runtime ya que inmediatamente terminaría el programa. Podemos evitar estos errores con la desactivación de la directiva $I. Para activar una directiva en medio del código:
{$I+}
Para desactivarla:
{$I-}

Es importante reactivar la directiva $I cuando ya no sea necesaría. Cuando está desactivada podemos acceder a la variable IOResult. Esta variable tiene el valor de cero (0) si la operación con archivos se ha llevado a cabo con éxito. En caso contrario, almacenará un valor distinto de cero. Vamos aplicar esta técnica al programa de cambio de nombre:
…..
Var
Archivo:File;
Begin
Assign(archivo,’Dato.dat’);
{$I-} (*Desactivamos la directive*)
Rename(archive,’nuevadata.dat’);
If IOResult<>0 Then
Write(‘Archivo no existe, no podemos renombrarlo….’);
{$I+} (*Reactivamos la directiva *)
End.


LES DESEO UNA FELIZ NAVIDAD Y UN PROSPERO AÑO 2007 Y ROGANDO AL "TODO PODEROSO" PARA QUE ILUMINE SUS CAMINOS EN ESTA NUEVA ETAPA DE SUS VIDAS Y SE HAGAN REALIDAD TODAS SUS METAS TRAZADAS.