Sunteți pe pagina 1din 23

8.

ARCHIVOS EN TURBOPASCAL
Conceptos: Archivo, Fichero, Estructura secuencial, Estructura aleatoria, Variable archivo, Archivo con tipo, Archivo de texto, Archivo sin tipo, Apertura, Cierre, Escritura, Lectura, Fin de archivo, Fin de lnea. Los datos estructurados vistos hasta ahora se denominan internos porque se almacenan en la memoria principal. Sin embargo, en ocasiones es preciso almacenar los datos de forma permanente en algn sistema de almacenamiento masivo. Los archivos o ficheros son el nico tipo de estructura que permiten almacenar datos en estos dispositivos o memoria externa. Otra caracterstica asociada a los ficheros es que su tamao slo est limitado por el espacio libre disponible en el dispositivo correspondiente. Se introducen los tipos de ficheros que pueden emplearse en TurboPascal: los archivos con tipo o de acceso aleatorio, los archivos de texto o secuenciales y los archivos sin tipo. La manipulacin de estas estructuras se realiza mediante un conjunto de rutinas predefinidas: assign, reset, rewrite, read, write, close La deteccin de errores en las operaciones de entrada y salida se efecta mediante la funcin predefinida ioresult y de las directivas del compilador a las que se tiene acceso en el programa.

Resumen:

Objetivos especficos. Al finalizar el tema, el alumno deber ser capaz de: a) Definir el concepto de archivo y describir los diferentes tipos de archivos y sus caractersticas fundamentales (Conocimiento) b) Describir las operaciones tpicas y las rutinas predefinidas correspondientes que se emplean en TurboPascal para la manipulacin de variables archivo (Comprensin) c) Interpretar el resultado de la ejecucin de un programa que emplea variables archivo (Comprensin) d) Determinar los formatos adecuados para almacenar los datos en un archivo con tipo o en un archivo de texto en funcin de las necesidades de una aplicacin (Aplicacin) e) Codificar una tarea sencilla convenientemente especificada utilizando variables archivo (Aplicacin)

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

90

8.1. INTRODUCCIN
Como se ha indicado anteriormente una estructura de datos es un conjunto de datos ms simples. Las estructuras de datos pueden clasificarse segn se realice su almacenamiento en: a) internas, que se almacenan en memoria. Por ejemplo, variables de tipo set, array, string o record, y b) externas, que se almacenan en dispositivos de almacenamiento masivo como puede ser el disco duro. La forma habitual de almacenar datos en un disco es mediante un archivo o fichero. Un archivo o fichero es una estructura o coleccin secuencial de datos de tamao variable que puede guardarse de forma permanente en un sistema de almacenamiento masivo. El acceso a los datos contenidos en el archivo puede ser secuencial (esto quiere decir que los datos se acceden en el orden en el que fueron introducidos) o aleatorio o directo (cada dato tiene asociado una posicin de almacenamiento).

8.2. CARACTERSTICAS DE LOS ARCHIVOS DE DISCO


Las principales caractersticas de los archivos de disco como estructura de datos son las siguientes: a) un archivo de disco es un almacn de datos no voltil, b) no tiene un tamao predeterminado: el tamao de un archivo puede ir variando durante la ejecucin de un programa segn las necesidades. Por otro lado, el tamao est slo limitado por el espacio de almacenamiento existente en disco y, c) en un archivo todos los datos estn almacenados en formato determinado, que no tiene porqu coincidir con el formato empleado en otros archivos. El uso de archivos de disco como almacn de datos tiene las siguientes ventajas: a) la posibilidad de manejar grandes cantidades de datos (tanto de entrada como de salida), b) los datos no se pierden al terminar de ejecutar un programa o al apagar el ordenador, es decir, pueden quedar almacenados permanentemente y, c) su empleo facilita la transmisin de datos entre programas, aplicaciones, ordenadores o sistemas diferentes. Esta ventaja afecta especialmente a los archivos de tipo text. Aunque su empleo tambin tiene algunos inconvenientes, tanto en la construccin como durante la ejecucin de un programa, as: a) la manipulacin de un archivo en un programa es algo ms complicada que el de una estructura de datos interna y, b) las operaciones de entrada y salida (el acceso para escritura y lectura en los archivos en disco) son relativamente ms lentas.

8.3. VARIABLES ARCHIVO EN TURBOPASCAL


Para poder trabajar y manipular datos con archivos de disco dentro de un programa escrito en TurboPascal es necesario utilizar una variable de un nuevo tipo: el tipo archivo. Este tipo de dato se estructura como una secuencia lineal de componentes. Como ya se detallar ms adelante, mediante esta variable, que hace las veces de intermediario, se podrn crear o eliminar archivos en el disco, introducir o sacar datos, etc. durante la ejecucin de un programa.

Archivos

91

PROGRAMA Manipulacin Variable archivo

DISCO (Sistema de almacenamiento masivo) Archivo de disco

Operaciones de entrada y salida de datos

Figura 30. Utilizacin de variables archivo para la manipulacin de archivos de disco

8.4. TIPOS DE VARIABLE ARCHIVO


En TurboPascal existen diferentes tipos genricos de variables archivo con los que se puede trabajar en los programas: a) Archivo con tipo (file of ... ): opera con datos de un tipo determinado (integer, real, char, string, array, record,... excepto tipo file). Los datos se almacenan en el archivo de disco con el formato binario correspondiente a ese tipo de dato tal y como se almacenan en memoria RAM. Cada dato de un archivo se denomina registro (no confundir con datos de tipo record). Debido a esto, por ejemplo, cada registro de un file of integer necesita una secuencia de 16 bits (2 bytes), mientras que un registro de un file of real ocupar 48 bits (6 bytes). b) Archivo de texto (text): trabaja con datos de tipo char: es decir, con caracteres del formato ASCII. As, los valores numricos se convierten en una secuencia de caracteres antes de escribirse en el archivo de disco. Cada registro, en este caso carcter, ocupa 1 byte. Los datos almacenados en este tipo de archivos son fcilmente accesibles desde otras aplicaciones como editores de texto, bases de datos, ... c) Archivo sin tipo (file): trabaja con bloques de bytes, desconocindose (en principio no interesa) qu se almacena o cmo estn estructurados los datos en el archivo de disco. Se utilizan para transferir de forma rpida grandes bloques de informacin. A continuacin, se detallarn las caractersticas, estructura y empleo de cada uno de ellos.

8.5. VARIABLES ARCHIVO CON TIPO


Las variables archivo con tipo permiten trabajar con archivos de acceso directo, es decir, cada dato tiene asociado dentro del archivo una posicin de almacenamiento mediante la cual puede accederse directamente a l. 8.5.1. Declaracin de variables archivo con tipo

Como cualquier otro elemento que se emplee en un programa, antes que nada, es necesario declararlas. Previo a la declaracin de las variables archivo se recomienda hacer la correspondiente declaracin del tipo de dato archivo con tipo. La declaracin de un tipo archivo se hace de la siguiente manera: Sintaxis: type tipo_archivo = file of tipo_de_dato; tipo_de_dato ha de ser o bien un tipo predefinido de TurboPascal o bien un tipo ya definido por el usuario. En este ltimo caso, es necesario declarar previamente el tipo de dato.

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

92

Ej.:

type

notas_1 = file of integer; {integer, char y real } notas_2 = file of char; { son tipos predefinidos } notas_3 = file of real; { de TurboPascal } cadena = string[30]; { Definido por el usuario } agenda_1 = file of cadena; vector = array[1..9] of integer; agenda_2 = file of vector; ficha = record nombre : string[30]; numero : integer end; listin = file of ficha;

Y, a continuacin, la correspondiente declaracin de variables archivo: Sintaxis: var ident_1 : tipo; Dadas las declaraciones de tipo anteriores: var a : notas_1; Ej.:
{ o tambien b c d e f directamente pero menos recomendable: } : file of integer; : agenda_1; : agenda_2; : listin; : file of ficha;

Se recomienda realizar primero la definicin del tipo archivo y posteriormente utilizar sta en la declaracin de la variable archivo. Los registros o componentes de un archivo pueden ser de cualquier tipo excepto file. Slo podrn realizarse operaciones de entrada y salida de datos que sean de tipo idntico o compatible al tipo_de_dato declarado en la variable archivo. Es decir, por ejemplo, en la variable archivo b declarada anteriormente como file of integer, no podrn almacenarse datos de tipo real (en general, ningn otro dato que no sea de tipo integer). 8.5.2. Estructura de una variable archivo con tipo

La estructura de cualquier variable archivo utilizada en un programa sigue de forma general el esquema de la Figura 31: dato_1 dato_2 dato_3 ... eof

Figura 31. Estructura de una variable archivo con tipo Un archivo con tipo es una secuencia de datos de un determinado tipo almacenados uno a continuacin de otro. Tras el ltimo registro del archivo se encuentra una seal, eof (end of file), que es la marca o carcter de fin de archivo. Esta marca es un carcter especial que no puede ser ledo y que indica el final del archivo. El acceso, tanto de entrada como de salida, a los datos o registros del archivo se permite a travs de un puntero o ventana asociado a cada variable archivo. Este elemento indica la posicin en la que se realiza el siguiente acceso de lectura o de escritura en el archivo en disco correspondiente. 8.5.3. Rutinas estndar para manejar variables archivo con tipo

En general, las variables de tipo archivo (file of ..., file o text) tienen una manera caracterstica de ser manipuladas durante la ejecucin de un programa, que las distinguen del resto de variables de otros tipos. Las variables archivo no pueden aparecer directamente ni en asignaciones ni en expresiones, pero pueden ser parmetros por variable de funciones y procedimientos. As, aunque se declaren dos variables archivo del mismo tipo var f,g: file of integer; no es correcta la asignacin f:=g;

Archivos

93

En TurboPascal existe un grupo de rutinas declaradas en la unidad estndar System que permiten manipular variables de tipo archivo. A continuacin, se comentan algunas de estas rutinas incluidas en la unidad estndar System para poder trabajar con variables archivo con tipo. Algunas de ellas sirven para otros tipos de variable archivo. 8.5.3.1 ASSIGN Cabecera13: assign(var f:<tipoarchivo>;archivodisco:string); El procedimiento assign asigna o asocia el nombre del archivo externo archivodisco al identificador de la variable archivo f. Para poder trabajar con una variable archivo es necesario en primer lugar asociar a la variable archivo TurboPascal correspondiente un archivo del disco. Esto permite la manipulacin del archivo externo con el que se trabaja. El nombre del archivo externo debe ser admisible por el sistema operativo DOS y no tiene porqu coincidir con el de un archivo ya existente en disco. En caso necesario puede indicarse la unidad (A:, B:, C:) y el camino o va de acceso (\TURBO\, \WP\TEXTOS\,...). La operacin que se haga con la variable archivo del programa, en la prctica se realizar en el archivo externo asociado. Ej. 1.: const archivo = 'archivo.dat';
type enteros = file of integer; var f : enteros; begin assign(f,archivo); Ej. 2.: type caracteres = file of char; var g : caractetes; archivo:string[30]; begin writeln('Escribe el nombre del archivo:'); readln(archivo); assign(g,archivo); Ej. 3.: type enteros = file of integer; var f : enteros; begin assign(f,'A:\PASCAL\datos1.dat');

8.5.3.2 REWRITE rewrite(var f:<tipoarchivo>); Cabecera: El procedimiento rewrite es el procedimiento de apertura de un archivo nuevo o no existente en disco. La ejecucin de la llamada a este procedimiento crea un nuevo archivo en el disco con el nombre previamente asignado mediante el procedimiento assign a la variable fichero. Hay que llevar cuidado con su empleo, ya que si exista un archivo con ese nombre se borrarn los datos contenidos en l. Una vez creado, lleva el puntero asociado a la variable archivo al inicio para comenzar operaciones de escritura. Por lo tanto, el archivo abierto con este procedimiento no posee ningn registro inicialmente. Ej.: type enteros = file of integer;
var f : enteros; begin assign(f,'miarchi.dat'); rewrite(f);

8.5.3.3 RESET Cabecera: reset(var f:<tipoarchivo>);

13

Como ya se ha visto la estructura de los procedimientos y funciones, se ha considerado de mayor utilidad mostrar la forma cmo se ha declarado la cabecera de las rutinas relacionadas con el uso de los archivos

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

94

El procedimiento reset es el procedimiento de apertura de un archivo que ya existe en disco. La ejecucin de la llamada a este procedimiento lleva el puntero al inicio o principio del archivo (registro n 0) para posteriores operaciones de escritura (entrada de datos) o de lectura (salida de datos). Ej.: type enteros = file of integer;
var f : enteros; begin assign(f,'miarchi.dat'); reset(f);

El archivo externo asociado a la variable fichero debe existir en el disco o se producir un error durante la ejecucin de esta sentencia en el programa. 8.5.3.4 WRITE

Cabecera: write(var f:<tipoarchivo>,var_1,var_2,...,var_n); El procedimiento write es el procedimiento de entrada o escritura de datos en un archivo ya existente en disco y previamente abierto. La ejecucin de la llamada a este procedimiento con las variables archivo es parecida a lo ya visto anteriormente con la pantalla o dispositivo estndar de salida de datos. En este caso, al ejecutarse el procedimiento, se escribe cada uno de los datos almacenados en las variables correspondientes en el archivo en disco asociado, moviendo a continuacin el puntero asociado a la variable archivo a la siguiente posicin de registro. La variable archivo debe haber sido abierta previamente en el programa. Las variables que se indiquen en la llamada al procedimiento han de ser idnticas al tipo de dato declarado para la variable archivo. El identificador de la variable archivo siempre debe colocarse despus del primer parntesis, en caso contrario, la escritura de datos se realiza por el archivo de salida estndar asociado por defecto: la pantalla del ordenador. Ej.: type enteros = file of integer;
var a,b,c : integer; f : enteros; begin assign(f,'archivo.dat'); rewrite(f); a:=16; b:=-1; c:=0; write(f,a,b,c); { resto de sentencias del programa . . . } end.

Al ejecutar la sentencia write(f,a,b,c); se almacenan tres registros o datos de tipo integer en el archivo de disco asociado y el puntero asociado a la variable archivo se mueve a la posicin siguiente segn indica la Figura 32: 16 Reg. n 0 -1 Reg. n 1 0 ... Reg. n 2 PUNTERO

Figura 32. Contenido del archivo y situacin del puntero asociado Como ya se ha mencionado anteriormente los datos son almacenados en el archivo de la misma manera que se almacenan en memoria, es decir, en el formato binario correspondiente al tipo del dato del registro. En este caso, al ser los datos de tipo integer, cada registro ocupar 2 bytes. Si pudiera verse el contenido bit a bit del archivo en disco asociado se vera lo que muestra la Figura 33 (la razn de incluir esta figura es la de mostrar la diferencia en cuanto a

Archivos

95

formato de almacenamiento entre este tipo de archivo y el archivo de texto que se ver posteriormente).
... 00000000 00010000 11111111 11111111 00000000 00000000 Registro n 0 Registro n 1 Registro n 2 PUNTERO

Figura 33. Contenido del archivo en representacin binaria y situacin del puntero asociado una vez realizada la operacin de escritura 8.5.3.5 EOF

Cabecera: eof(var f:<tipoarchivo>): boolean; La funcin eof devuelve el valor lgico true o false dependiendo si el puntero asociado a la variable archivo f est apuntando a la marca de fin de archivo (tambin llamada eof) o a cualquier otro registro del archivo, respectivamente. Por ejemplo, inmediatamente despus de ejecutarse la llamada al procedimiento rewrite(f), una llamada a la funcin eof(f) devolvera siempre el valor True, ya que el archivo est vaco. Despus de la ejecucin reset(f), la funcin eof(f) devolvera el valor True si el archivo estuviera vaco y False en caso contrario. Ej.: type enteros = file of integer;
var f : enteros; begin assign(f,'miarchi.dat'); reset(f); { miarchi.dat debe existir en disco } if eof(f) then writeln('Archivo vacio') else writeln('Archivo no vacio')

8.5.3.6

READ

Cabecera: read(var f:<tipoarchivo>,var idvar1,...,var idvar_n); El procedimiento read es el procedimiento de salida o lectura de datos de un archivo. La ejecucin de la llamada al procedimiento read lee uno o ms datos del archivo en disco asociado y lo/s almacena en la/s variable/s correspondientes. Estas variables han de ser de un tipo idntico al declarado para la variable archivo con tipo. Cada vez que se lee un registro del archivo se lleva al puntero a la siguiente posicin. Ej.: type enteros = file of integer;
var a,b,c : integer; f: enteros; begin assign(f,'archivo.dat'); reset(f); { Archivo.dat debe existir en disco } read(f,a,b,c);

Con el archivo en disco creado en el ejemplo anterior se almacenaran en las variables de tipo integer a, b y c los valores enteros 16, 1 y 0 respectivamente. La ejecucin de este procedimiento produce un error si se intenta leer cuando el puntero seala el carcter o marca de fin de archivo, eof, de un archivo. Una manera muy prctica y habitual de leer secuencialmente todos los datos de un archivo sera mediante el siguiente bucle while:
type enteros=file of integer; var a,b,c : integer; f: enteros; begin assign(f,'miarchi.dat'); reset(f); while not eof(f) do read(f,a); close(f); writeln('El ultimo dato de miarchi.dat es: ',a); end.

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

96

8.5.3.7

CLOSE

Cabecera: close(var f:<tipoarchivo>); El procedimiento close es el procedimiento de cierre de un archivo previamente abierto. Es recomendable utilizar este procedimiento al dejar de trabajar con el archivo en disco. La ejecucin de este procedimiento transfiere los posibles datos almacenados en el buffer o almacn intermedio al archivo del disco y lo cierra liberando al sistema operativo del control de archivo. Si no cerramos el archivo los datos que quedan en el buffer o almacn temporal intermedio de la memoria podran perderse sin quedar almacenados en el archivo. Ej.: type enteros = file of integer;
var a,i : integer; f : enteros; begin assign(f,'miarchi.dat'); rewrite(f); { Algunas operaciones de escritura de datos } for i:=1 to 10 do write(f,i); close(f); reset(f); { Operaciones de escritura } while not eof(f) do read(f,a); close(f); writeln('El ultimo dato de miarchi.dat es: ',a); end.

Aunque se cierre la variable archivo, el archivo de disco correspondiente sigue asociado a la variable archivo, despus de la ejecucin de las llamadas al procedimiento close(f). 8.5.3.8 RENAME

Cabecera: rename(var f:<tipoarchivo>;nombrearchivo:string); El procedimiento rename permite cambiar el nombre del archivo de disco asociado a una variable archivo. El contenido del archivo de disco no sufre ninguna modificacin. La llamada al procedimiento de cambio de nombre puede hacerse con una variable archivo abierta, no abierta todava o cerrada. Ej.: type reales = file of real;
var f : reales; begin assign(f,'antiguo.dat'); rename(f,'nuevo.dat');

8.5.3.9 ERASE Cabecera: erase(var f:<tipoarchivo>); El procedimiento erase permite borrar el archivo del disco asignado a la variable archivo. La variable archivo archivo debe estar cerrada. Ej.: type reales = file of real;
var f : reales; begin assign(f,'miarchi.dat'); erase(f);

8.5.3.10 SEEK
seek(var f:<tipoarchivo>;posicion:longint); Cabecera: Este procedimiento mueve el puntero asociado a la variable archivo previamente abierta a la posicin indicada por el segundo parmetro entero. Se considera que la posicin del primer registro del archivo es la 0. Por ejemplo, en el caso del archivo de disco de la Figura 34.

Archivos

97

16

-1

-4

-25

33

eof

Reg. n 0 Reg. n 1 Reg. n 2 Reg. N 3 PUNTERO Reg. n 5 Figura 34. Contenido del archivo y situacin del puntero asociado a la variable archivo f La ejecucin de las sentencias
type enteros = file of integer; var f : enteros; begin assign(f,'miarchi.dat'); reset(f); seek(f,2);

dejara al puntero asociado sealando el tercer registro del archivo, es decir, el valor entero -4, segn indica la Figura 35. 16 -1 -4 -25 6 33 eof Reg. n 0 Reg. n 1 PUNTERO Reg. n 3 Reg. n 4 Reg. n 5 Figura 35. Contenido del archivo de disco y situacin del puntero asociado a la variable archivo f una vez ejecutada la llamada a la sentencia seek(f,2) A esta operacin es a la que se conoce como acceso directo a un registro de un archivo. Aunque puede utilizarse la sentencia seek(f,0), lo habitual para situar el puntero sealando al primer registro de un archivo es usar el procedimiento reset(f), aunque la variable archivo estuviera previamente abierta. 8.5.3.11 FILEPOS Cabecera: filepos(var f:<tipoarchivo>):longint; La llamada a la funcin filepos devuelve la posicin actual del puntero asociado a una variable archivo. Por ejemplo, inmediatamente despus de ejecutar la llamada al procedimiento reset(f), la funcin filepos(f) devolvera el valor entero 0. type enteros=file of integer; Ej.:
var f: enteros; begin assign(f,'miarchi.dat'); reset(f); write(f,a); { N indeterminado de operaciones de escritura . . .} write(filepos(f));

8.5.3.12 FILESIZE Cabecera: filesize(var f:<tipoarchivo>):longint; La funcin filesize devuelve el nmero de componentes o registros almacenados en un archivo. El valor devuelto es de tipo entero. Si el archivo est vaco devuelve un cero. As, despus de la llamada al procedimiento rewrite(f), la funcin filesize(f) devuelve el valor 0. Por ejemplo, si a la variable archivo f de tipo file of integer se le asocia el archivo de disco de la Figura 36: 2 0 13 -23 eof Figura 36. Contenido del archivo de disco. la sentencia Write(FileSize(f)) escribira el valor 4 por pantalla. Como otro ejemplo de uso, para aadir datos a un archivo se mueve el puntero al final de archivo...
seek(f,filesize(f));

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

98

que deja al puntero sealando la marca de fin de archivo. 8.5.4. Programas ejemplo con archivos con tipo

A continuacin, se muestra el cdigo de dos programas ejemplo que trabajan con un archivo con tipo que almacena datos de tipo integer:
{ Programa que introduce varios datos enteros en un archivo de disco } program intdatos; type enteros = file of integer; var dato,k,total:integer; f:enteros; begin assign(f,'valores.dat'); rewrite(f); write('Cuantos valores? '); readln(total); for k:=1 to total do begin write('Dato n ',k,': '); readln(dato); write(f,dato) end; close(f) end.

Ejemplo de ejecucin del programa intdatos:


c:\tp\archivos>intdatos Cuantos valores? 5 Dato n 1: 12 Dato n 2: 4 Dato n 3: 7 Dato n 4: 0 Dato n 5: 5

Una vez ejecutado, crea el archivo valores.dat: 12 4 7 0 5 eof

Figura 37. Contenido del archivo de disco valores.dat En el siguiente programa ejemplo, se trabaja con el archivo de disco generado con el programa anterior, leyendo los datos almacenados y visualizando por pantalla el nmero de caracteres correspondiente al valor entero ledo.
program grafica; type archivo = file of integer; var valor, i : integer; f : archivo; begin assign(f,'valores.dat'); reset(f); i:=1; while not eof(f) do begin read(f,valor); write('Valor n ',i,': '); while valor>0 do begin write('*'); dec(valor) end; writeln;

Archivos

99

inc(i) end; close(f) end.

La salida por pantalla del ejemplo de ejecucin del programa grafica supuesto que el contenido del archivo 'valores.dat' es el mostrado en la Figura 37:
c:\tp\archivos>grafica Valor n 1: ************ Valor n 2: **** Valor n 3: ******* Valor n 4: Valor n 5: *****

8.6. VARIABLES ARCHIVO DE TEXTO


El tipo de dato text es un tipo predefinido en TurboPascal. Con variables de este tipo pueden manipularse, es decir, realizar operaciones de lectura y escritura con datos de tipo entero, real, boolean (slo escritura), char y string que se almacenan en el archivo de disco correspondiente en el formato de caracteres del cdigo ASCII. Por poseer un formato estndar son los ms adecuados para intercambiar informacin con otros programas y sistemas: un archivo ASCII puede crearse y modificarse con casi cualquier otro editor o procesador de texto. Por ejemplo, los editores del sistema operativo DOS EDLIN y EDIT, el editor Block de Notas del sistema Windows y el propio editor del entorno integrado de TurboPascal. Tambin pueden manipularse con otros comandos del sistema operativo. Por ejemplo, puede visualizarse su contenido en pantalla de un archivo ASCII con el comando TYPE del sistema operativo DOS o enviarse a la salida por impresora con el comando PRINT.

Figura 38. Visualizacin de un archivo ASCII con el Block de Notas de Windows 8.6.1. Declaracin de variables archivo de texto

Al ser el tipo text un tipo predefinido en TurboPascal puede utilizarse directamente en la declaracin de variables: Sintaxis: var archivo:text; Ej.: var f,g:text;

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

100

8.6.2.

Estructura de las variables archivo de texto

Las variables archivo de tipo text estn estructuradas por lneas que contienen caracteres, cadenas o frases separadas por una marca que indica el fin de la lnea: eoln (end of line). Para TurboPascal (en realidad, para el sistema operativo) eoln es una secuencia de dos caracteres ASCII: el carcter de retorno de carro o CR (carcter n 13 del cdigo ASCII) y el carcter de avance de lnea o LF (ASCII n 10). El final de un archivo de texto se indica como con los archivos con tipo: con una marca de fin de archivo eof. Al emplear una variable archivo de tipo text, el archivo de disco a manipular quedar estructurado, por ejemplo, siguiendo el esquema de la Figura 39:
'1' '3' '.' '4' #13 #10 ' ' ' ' 'O' 'k' #13 #10 '$' '$' #27

eoln

eoln

eof

Figura 39. Ejemplo de contenido y estructura de una variable archivo de texto En realidad, ya se han utilizado dos dispositivos que tienen una estructura similar a los archivos de tipo text: el teclado, denominado input en Pascal estndar, que sirve slo para lectura (entrada de datos), y la pantalla, denominada output, que slo es de escritura (salida de datos). En Pascal estndar estos archivos hay que declararlos obligatoriamente en la cabecera del programa, no as en TurboPascal. En estas dos variables archivo la marca de fin de lnea se obtiene pulsando la tecla INTRO, cerrndose con una marca de final de archivo: eof (end of file) que se obtiene pulsando la combinacin de teclas CTRL + Z. 8.6.3. Rutinas estndar para manipular variables de tipo TEXT

Para trabajar con variables de tipo text pueden emplearse todas las subrutinas comentadas anteriormente para los archivos con tipo, excepto Seek, FilePos y FileSize. Como caractersticas diferenciadoras, siendo f una variable de tipo text, la ejecucin del procedimiento rewrite(f) lo convierte en archivo de slo escritura, mientras que la ejecucin de reset(f) lo convierte en archivo de slo lectura. Adems, con las variables de tipo text pueden utilizarse otras subrutinas que se detallan a continuacin: 8.6.3.1 WRITELN

writeln(var f:text;expresion_1,...,expresion_n); Cabecera: El procedimiento writeln escribe en el archivo f los valores de los datos (constantes o variables) y, a continuacin, una marca de fin de lnea. Esta ltima operacin adicional diferencia al procedimiento writeln del otro procedimiento anlogo de escritura de datos en una variable archivo de tipo text (write). Ej.: var a,b,c:integer;
f:text; begin assign(f,'miarchi.dat'); rewrite(f); a:=16; b:=-1; c:=0; writeln(f,a,b,c);

Los datos de tipos numricos se convierten en caracteres del cdigo ASCII y quedan almacenados como tales en los archivos de disco asociados al emplear los procedimientos

Archivos

101

write o writeln. Con la ltima sentencia del ejemplo anterior se escribira en el archivo de disco miarchi.dat... como muestra la Figura 8.11. '1' '6' ... PUNTERO Figura 40. Contenido del archivo de disco miarchi.dat. '-' '1' '0' #13 #10

Estos datos almacenados como caracteres del cdigo ASCII, se codificaran en formato binario de la siguiente manera:
00110001 00110110 00101101 00110001 00110000 00001101 00001010 ... PUNTERO

Figura 41. Contenido en formato binario del archivo de disco miarchi.dat. Es importante observar la diferencia en cmo se almacenan datos de tipo integer en un archivo de disco mediante una variable tipo text, con respecto a cmo lo hacen mediante una variable archivo de tipo file of integer. El primero los almacena en formato de caracteres ASCII y el segundo almacena la representacin binaria del nmero entero (obsrvese la Figura 33). En variables de tipo text, los procedimientos write y writeln pueden escribir en un archivo de disco, datos de tipo char, string, entero, real y boolean de manera similar a cmo lo hacen en la pantalla, es decir utilizando un determinado nmero de columnas (caracteres en blanco en un archivo de texto), por ejemplo:
var r:real; i:integer; c:char; f:text; begin assign(f,'miarchi.txt'); rewrite(f); r:=8.123; i:=-2; c:='*'; writeln(f,r:4:1,i:5,c:3);

' ' '8' '.' '1' ' ' ' ' ' ' '-' '2' ' ' ' ' '*'

#13

#10

eoln

Figura 42. Contenido del archivo de texto resultante de la ejecucin de las sentencias anteriores. Si en lugar del identificador de la variable archivo f, se coloca el identificador lst, la salida de datos se realiza a la impresora. Ej.: writeln(lst,a); Nota: el identificador lst est declarado como una variable archivo de tipo text en la unidad Printer estndar de TurboPascal. 8.6.3.2 EOLN

eoln(var archivo:text):boolean; Cabecera: La funcin eoln devuelve el valor true o false si el puntero apunta o no a la posicin de la marca de fin de lnea eoln (en concreto, slo si apunta al primer carcter que la forma) o de la marca de fin de archivo eof.
Ej.: var f:text; b:boolean; begin assign(f,'miarchi.txt'); reset(f); if eoln(f) then ...

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

102

En la figura siguiente se indica el valor que devuelve esta funcin si el puntero est apuntando al carcter situado en la parte superior: '1' '6' '-' '1' '0' #13 #10 ... false false false false false true false Figura 43. Contenido del archivo miarchi.txt y resultado (abajo) de la llamada a la funcin eoln segn la posicin del puntero 8.6.3.3 READLN

Cabecera: readln(var f:text;var idvar_1,...,var idvar_n); El procedimiento readln lee los datos a los que apunta el puntero de la variable archivo text, los almacena en la/s variable/s correspondiente/s y, finalmente, mueve el puntero hasta el primer carcter despus de la siguiente marca de fin de lnea que se encuentre. Esta ltima operacin adicional diferencia al procedimiento readln del otro procedimiento anlogo de lectura de datos en una variable archivo de tipo text (read).
Ej.: var d:string[10]; f:text; begin assign(f,'miarchi.txt'); reset(f); readln(f,d);

Con el puntero de la variable archivo f del ejemplo anterior apuntando al primer carcter '1' se almacenara la cadena formada por los caracteres '16-10' en la variable d y el puntero quedara apuntando al primer carcter a continuacin de la marca de fin de lnea. Las variables donde se almacena la informacin leda pueden ser de tipo char, cadena, entera o real. Si la variable donde se almacena el dato ledo es de tipo numrico, los procedimiento readln realiza una conversin de datos (de ASCII al tipo numrico correspondiente) antes de almacenarlo en la variable. 8.6.3.4 Nota importante sobre los procedimientos read y readln Al utilizar los procedimientos de salida de datos read y readln con variables de tipo text, es importante tener siempre muy en cuenta el tipo de variable en la que vamos a almacenar el dato que se acaba de leer y el/los posibles caracteres que se pueden encontrar en los archivos de texto. Pueden aparecer errores durante la ejecucin de un programa si se intentan algunos tipos de asignaciones incompatibles. Por ejemplo, surgira un error durante la ejecucin de un programa si se intenta asignar a una variable de tipo numrico una secuencia de caracteres no numricos. Para intentar dar una idea de los distintos comportamientos que puede tener el procedimiento read, se ha construido la Tabla 21, que muestra, en funcin del tipo de la variable a y de la posicin del puntero cuando se realiza la llamada al procedimiento read(f,a), el valor que toma la variable a y la posicin a la que apunta posteriormente el puntero.
program ejemplo; var a : ? ; { Declaracion de la variable a } f : text; { Declaracion de la variable archivo } begin assign(f,'archivo.dat'); reset(f); { operaciones diversas ... de lectura y escritura } { Lectura de un dato de la variable archivo } read(f,a);

Archivos

103

donde archivo.dat es un archivo de disco que almacena la siguiente sucesin de caracteres mostrada en la Figura 44: 0 3 1 2 1 3 2 4 . 5 7 6 7 8 h 9 a 10 11 #13 #10 12 13 14 8 15 ... 16

Figura 44. Contenido del archivo de texto archivo.dat. Otra aclaracin importante es la siguiente: Los procedimientos read y readln no producen un error de ejecucin cuando se intenta leer una marca de fin de fichero (eof) en variables de tipo TEXT. Ejemplo de lectura de la Tabla 21: Si el puntero seala al carcter n 6 y la variable a es de tipo string[4] entonces tras la sentencia read(f,a);, la variable a almacena la cadena '7 h' y el puntero queda sealando el carcter n 10.

Si el ... y la variable a es de tipo... puntero char string[1] string[4] integer real seala al caracter n ... a almacena el valor... y el puntero queda sealando el caracter n...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 '-' '3' ' ' '1' '2' '.' '7' ' ' ' ' 'h' 'a' ' ' #13 #10 ' ' '8' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 '-' '3' ' ' '1' '2' '.' '7' ' ' ' ' 'h' 'a' ' ' '' #10 ' ' '8' 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16 '-3 1' '3 12' ' 12.' '12.7' '2.7 ' '.7 ' '7 h' ' ha' ' ha ' 'ha ' 'a ' ' ' '' #10' 8 ' ' 8 ?' '8 ??' 4 5 6 7 8 9 10 11 12 12 12 12 12 16 17 18 -3 3 Error Error Error Error 7 Error Error Error Error 8 8 8 8 8 2 2 -3.0 3.0 12.7 12.7 2.7 0.7 7.0 Error Error Error Error 8.0 8.0 8.0 8.0 8.0 2 2 7 7 7 7 7

16 16 16 16 16

16 16 16 16 16

Tabla 21. Resultados de la ejecucin de la sentencia read(f,a); en funcin de la posicin de la posicin del puntero asociado a la variable archivo y del tipo de variable donde se almacena la informacin leda

8.6.3.5 Observaciones sobre la lectura mediante variables text Hay una serie de puntos que es necesario tener en cuenta para evitar problemas y errores de ejecucin cuando se realizan operaciones de lectura en variables de tipo text, y posteriormente, el dato ledo se almacena en una variable de un tipo determinado. a) Con una variable de tipo char la operacin nunca da problemas: almacena siempre el carcter ledo y deja el puntero apuntando a la siguiente posicin. Esto ocurre incluso con los caracteres de control (caracteres ASCII n 13, n 10, etctera) siendo la nica

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

104

excepcin la marca de fin de archivo, cuyo intento de lectura provoca un error en la sentencia readln durante la ejecucin de un programa. b) Con una variable de tipo string almacena como mximo un nmero de caracteres igual a su tamao declarado. La cadena leda y posteriormente almacenada se trunca al encontrar una marca de fin de lnea o de archivo. La ejecucin del procedimiento no almacena ningn dato si el puntero apuntaba al carcter de retorno de carro (carcter ASCII n 13), dejando al puntero en la misma posicin. c) Con una variable de tipo entero el puntero puede saltar caracteres en blanco (carcter ASCII n 32), tabuladores (carcter ASCII n 9) y caracteres de fin de lnea (secuencia de caracteres ASCII n 13 y n 10) hasta encontrar una secuencia de caracteres numricos que sea entera. A esta secuencia debe seguir inmediatamente un carcter en blanco, un tabulador o una marca de fin de lnea o fin de archivo. En caso contrario, se produce un error de ejecucin.

d) Con una variable de tipo real funciona de manera similar al anterior, permitiendo adems, que la secuencia de caracteres sea un valor real (dgitos separados por un punto). Se recuerda que los procedimientos read (con las variables de tipo text) y readln admiten variables de tipo entero, real, char y cadena. El procedimiento readln difiere del anterior en que una vez hecha la salida de datos deja al puntero sealando al primer carcter a continuacin de la siguiente marca de fin de lnea que se encuentra. Se propone como ejercicio realizar la tabla equivalente a la anterior resultante de la llamada al procedimiento readln(f,a) 8.6.3.6 APPEND

Cabecera: append(var f:text); El procedimiento append abre una variable text asociada a un archivo en disco existente para aadir datos al final del mismo. Deja el puntero asociado, apuntando a la marca de fin de archivo, permitiendo posteriores operaciones de escritura en el archivo de disco. var f:text;s:string; Ej.:
begin assign(f,'archivo.dat'); append(f); s:='Ultima linea'; writeln(f,s);

8.6.3.7

SEEKEOLN

Cabecera: seekeoln(var f:text):boolean; La funcin seekeoln(f) es similar a la funcin eoln(f) excepto que salta espacios en blanco y tabuladores antes de hacer la verificacin. El puntero no se mueve de su posicin al realizar la verificacin. En la Figura 45 se indica el valor que devuelve esta funcin si el puntero est apuntando al carcter superior: ' ' '6' '1' ' ' ' ' #13 #10 ... false false false true true true false
Figura 45. Contenido de un archivo de texto y valor devuelto por la funcin eoln en el caso de que el puntero estuviera apuntando al carcter superior.

Archivos

105

8.6.3.8

SEEKEOF

Cabecera: seekeof(var f:text):boolean; La funcin seekeof(f) es similar a eof(f) aunque salta blancos, tabuladores y marcas de fin de lnea antes de hacer la verificacin de que el puntero asociado a la variable archivo est apuntando a la marca de fin de archivo. El puntero no se mueve de su posicin al realizar la verificacin. 8.6.4. Diferencias entre una variable archivo de tipo file of char y otra variable archivo de tipo text

Trabajar con una variable de tipo file of char en un programa no es lo mismo que hacerlo con una de tipo text. Aquella es una variable archivo de acceso directo, tiene subrutinas de manipulacin especficas y no se considera estructurada por lneas (aunque pueda tratar las marcas de fin de lnea sin ningn tipo de problemas, como si fueran dos caracteres ms del archivo de disco). La variable de tipo text se trata como un archivo secuencial (por ejemplo, no puede emplear el procedimiento seek), tambin tiene subrutinas de uso propio y est estructurada por lneas. De forma que la declaracin en un programa de la variable archivo con tipo
var var f: file of char; f: text;

es distinta de la declaracin de la variable archivo de texto Sin embargo, un archivo de disco cuyos datos se almacenen en formato ASCII puede ser manipulado por cualquiera de las dos variables anteriormente declaradas en un programa de TurboPascal, teniendo en cuenta las peculiaridades en la manipulacion de cada una de los tipos de archivo. Como resumen se subraya que en archivos de tipo text slo pueden manipularse (escribir y leer) variables de tipo entero, real, char o string y cualquier dato que se trate se har en formato ASCII. 8.6.5. Programas ejemplo con archivos de texto

Seguidamente se muestra otro ejemplo de la utilizacin de variables archivo de texto en un programa:


program archivador; type ficha = record alumno : string[20]; matricula: word; nota: real end; var g:text; procedure cf(var f:text; c:string); var i,n:integer; p:ficha; begin assign(f,c); rewrite(f); write('Cuantos alumnos?: '); readln(n); for i:=1 to n do with p do begin write('Nombre: '); readln(alumno); writeln(f,alumno); write('N matricula: '); readln(matricula); write(f,matricula:6);

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan write('Nota: '); readln(nota); writeln(f,nota:6:2) end; close(f) end; { Otras declaraciones ... } function media(var f:text):real; var r,a:real; n,i:word; begin i:=0;r:=0; reset(f); while not eof(f) do begin readln(f); read(f,n); readln(f,a); r:=r+a; inc(i); end; close(f); media:=r/i end; begin { Cuerpo del programa . . . } end.

106

Al ejecutar en el programa principal la llamada al procedimiento


cf(g,'fichas');

se visualiza por pantalla:


Cuantos alumnos? 5 Nombre: Francisco Perez N matricula: 13245 Nota: 7.5 Nombre: Maria Lopez N matricula: 14074 Nota: 6.25 Nombre: Mario Garcia N matricula: 17721 Nota: 4 Nombre: Sergio Sebastian N matricula: 18555 Nota: 5.125 Nombre: Ana Martin N matricula: 19229 Nota: 8.2

crendose adems el archivo de texto fichas en disco con el siguiente contenido:


Francisco Perez#13#10 13245 7.50#13#10 Maria Lopez#13#10 14074 6.25#13#10 Mario Garcia#13#10 17721 4.00#13#10 Sergio Sebastian#13#10 18555 5.13#13#10 Ana Martin#13#10 19229 8.20#13#10

Al ejecutarse a continuacin en el programa la sentencia writeln(media(f)); se visualiza por pantalla: 6.2160000000E+00

Archivos

107

8.7. LA FUNCIN IORESULT


La funcin estndar de TurboPascal ioresult permite la prevenir y gestionar errores que se puedan producir durante la ejecucin de un programa al manipular variables archivo de cualquier tipo. Cabecera de la funcin ioresult : integer; Esta funcin sirve para todo tipo de archivos: devuelve un valor entero, que es cero si no se ha producido un error, y en caso de que haya ocurrido, un nmero entre 1 y 255 en funcin del error cometido. Un ejemplo de utilizacin de esta funcin se da en el siguiente programa. Se trata de un programa que quiere aadir una serie de datos al final de un archivo ya existente o bien crear uno, si ste no existiera previamente, e introducir posteriormente la serie de datos en el nuevo archivo. Surge una cuestin: qu procedimiento de apertura utilizar para abrir la variable archivo? Si se emplea el procedimiento reset y el archivo no existe se producir un error de ejecucin. Si se emplea el procedimiento rewrite, se crear un archivo nuevo, perdindose los datos que estuvieran en el archivo si ste existiera. El problema se ha solucionado empleando conjuntamente una directiva del compilador, {$I}, y la funcin ioresult de la siguiente manera:
program ejemplo; type enteros=file of integer; var f:enteros; i:integer; begin assign(f,'enteros.dat'); {$I-} reset(f); {$I+} if ioresult<>0 then begin writeln('Se crea un archivo nuevo'); rewrite(f) end else seek(f,filesize(f)); for i:=1 to 3 do write(f,i); reset(f); while not eof(f) do begin read(f,i); writeln(i) end end.

La directiva de compilacin {$I} controla la generacin de errores en las operaciones de Entrada y Salida de datos (por ejemplo, en la escritura de datos en un archivo) en tiempo de ejecucin. Por defecto, su estado es activa {$I+}. En el ejemplo anterior, la directiva {$I-} evita que se detenga la ejecucin del programa al tratar de ejecutarse la sentencia reset(f) y no encontrarse el archivo asociado con el procedimiento assign en el disco. En este caso, aunque el programa pueda seguir ejecutndose con la siguiente sentencia, no puede volver a realizarse una llamada a una sentencia de manipulacin de archivos. La directiva {$I+} permite de nuevo estas operaciones. La funcin ioresult determina si se ha producido un error o no en la operacin anterior (reset(f);) y en el caso de que se haya producido (valor devuelto distinto de 0), presumiblemente por no existir dicho archivo, permite crear un archivo nuevo en disco. En general, el control de esta directiva consiste en que despus de cada operacin de E/S el programa realiza internamente una llamada a una subrutina que supervisa este tipo de operaciones: la funcin estndar ioresult. Si el valor numrico entero devuelto por ioresult es igual a cero significa que no ha habido ningn error de E/S y el programa sigue su curso. En caso contrario la funcin devuelve un valor distinto de cero dependiendo del tipo

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

108

de error generado (ver siguiente seccin), se genera un error de ejecucin y el programa detiene su curso. Si la directiva desconecta el control de las operaciones de E/S: {$I-}, al producirse un error de ejecucin no se detiene el programa, pero no puede volverse a realizar otra operacin de E/S hasta que no se llama explcitamente en el programa a ioresult lo cual inicializa el valor devuelto por la funcin (le da valor 0) permitiendo una nueva operacin de E/S. 8.7.1. Errores de entrada/salida en decimal

Los valores que devuelve la funcin ioresult y el tipo de error asociado se indican en la Tabla 22.
Tabla 22. Cdigo de error devuelto por la llamada a la funcin ioresult

Cdigo
0 1 2 3 4 10 32 33 34 144 145 153 240 241 242 243 255

Significado
No hay error No existe el archivo. No se abri el archivo de entrada. Por ejemplo, falta la sentencia reset(f) No se abri el archivo de salida. Archivo sin abrir. Error en la conversin a formato numrico tras la lectura de un dato no numrico mediante una variable archivo text. Operacin no permitida en el dispositivo lgico. No permitido en modo directo. Asignacin a archivo estndar no permitido. Discrepancia en la longitud de un registro. Bsqueda ms all del fin de archivo. Fin de archivo inesperado. Error de escritura en el disco. Directorio lleno. Tamao de archivo demasiado grande. Demasiados archivos abiertos. Archivo desaparecido.

8.8. VARIABLES ARCHIVOS SIN TIPO


El archivo sin tipo es tratado como una sucesin de bytes que se manipulan como una serie de bloques de bytes sin importar como estuvieran estructurados los datos almacenados en el archivo de disco. Permite trabajar con cualquier tipo de archivo cualesquiera sea su contenido, tipo o estructura. 8.8.1. Declaracin de variables archivo sin tipo La declaracin de variables archivo sin tipo se realiza de la siguiente manera: var f:file; Sintaxis: donde file es el tipo de dato correspondiente a un archivo sin tipo 8.8.2. Estructura de las variables archivo sin tipo

Al emplear una variable archivo de tipo file, el archivo de disco asociado a manipular quedar formalmente estructurado en n bloques de T bytes cada uno.

Archivos

109

byte1

b2 ... Bloque 1

bT

b1 b2 ... bT Bloque 2

... ...

b1

b2 ... bT Bloque n-1

b1 ... bF Bloque n

eof

Figura 46. Estructura de una variable archivo sin tipo.

En general, el tamao del ltimo bloque, F, puede ser distinto del tamao definido para el bloque, T, es decir, puede no coincidir el producto nT con el tamao en bytes del archivo. 8.8.3. Subrutinas especficas de manipulacin de archivos sin tipo

Si bien algunas de las subrutinas vistas anteriormente pueden emplearse en este tipo de archivo, existen una serie de subrutinas que son especficas para su manipulacin. 8.8.3.1 Procedimientos de apertura El formato de los procedimientos de apertura de variables archivo reset y rewrite es distinto al usado anteriormente. Sus cabeceras de declaracin, en el caso de ser empleadas con variables archivo sin tipo, corresponden respectivamente a:
procedure reset(var f:file; bloque: word); procedure rewrite(var f:file; bloque: word);

donde bloque es un nmero entero de tipo word que indica el tamao (en bytes) o longitud de los bloques en los que queda estructurada la variable archivo. Este segundo parmetro es opcional; si se omite se configura por defecto un tamao de bloque de 128 bytes. var f:file: Ej.:
begin assign(f,'datos.dat'); reset(f,16);

En el ejemplo anterior se abre la variable archivo f dejando estructurado formalmente para su manipulacin en bloques de 16 bytes el archivo datos.dat. byte1 b2 ... Bloque 1 b16 b1 b2 ... b16 Bloque 2 ... ... b1 b2 ... b16 Bloque n-1 b1 ... bF Bloque n

eof

Figura 47. Variable archivo sin tipo estructurada en bloques de 16 bits (con F16).

8.8.3.2 Procedimientos de entrada y salida de datos Para escribir o leer datos en una variable archivo sin tipo no se utilizan los procedimientos write, writeln, read o readln vistos anteriormente, sino otros especficos para este tipo de variables archivo. El procedimiento de escritura de datos blockwrite escribe uno o ms bloques de datos procedente de una variable genrica auxiliar en una variable archivo sin tipo. Su cabecera es la siguiente:
procedure blockwrite(var f:file;var aux; m:word [;var r:word]);

El procedimiento de lectura de datos blockread lee uno o ms bloques de datos de una variable archivo sin tipo y los almacena en una variable genrica auxiliar. Su cabecera es la siguiente:
procedure blockread(var f:file;var aux; m:word [;var r:word]);

Los parmetros formales indicados anteriormente tienen el siguiente significado: a) f es una variable archivo de tipo file, b) aux es una variable de cualquier tipo, de donde se toman los datos que se escriben en la variable archivo (blockwrite) o en donde se van a introducir los datos que se

Fundamentos de programacin - A. Garca-Beltrn, R. Martnez y J.A. Jan

110

lean de la variable archivo (blockread). Se suele emplear habitualmente una variable de tipo array de un tamao adecuado al total de los bloques manipulados, c) m es una expresin de tipo word que indica el nmero mximo de bloques a manipular en cada llamada al procedimiento, d) r es un parmetro opcional (por eso se ha indicado entre corchetes en la cabecera) que almacena el n de bloques que se han terminado de escribir o leer tras la ejecucin del procedimiento. Si se especifica en la llamada, el parmetro real ha de ser una variable de tipo word. Aunque ambos procedimiento parezcan tener parmetros similares, mientras que el procedimiento BlockWrite escribe uno o ms bloques (sucesiones de bytes almacenados en la variable genrica aux) en el archivo asociado a la variable f, el procedimiento BlockRead lee uno o ms bloques de bytes del archivo y los almacena en la variable aux. Por lo tanto, es importante tener siempre presente el tamao de la variable genrica aux y el nmero y tamao de los bloques con los que se trabajan, para evitar problemas en la escritura y lectura de los datos. Como continuacin del ejemplo de la seccin anterior, en el programa:
var f:file: a:array[1..64] of char; begin assign(f,'datos.dat'); reset(f,16); blockread(f,a,4);

la ejecucin de la sentencia blockread(f,a,4); almacenara 4 bloques (4 x 16 bytes) en la variable a, que podra haberse definido previamente, por ejemplo, como una variable de tipo array[1..64] of char, es decir, con el tamao adecuado para almacenar todo lo ledo del archivo (64 bytes). 8.8.4. Otros procedimientos y funciones

Algunos de los procedimientos y funciones empleados en los tipos de archivo vistos anteriormente pueden asimismo emplearse con las variables archivo sin tipo. Entre estos se encuentran los procedimientos Close, Reset, etc. Como ejemplo de utilizacin de las rutinas anteriores, los siguientes programas realizan una copia de un archivo de disco en otro:
(* Realiza una copia del archivo antiguo.dat *) program copia_archivo_1; var f,g: file; res_f,res_g: word; aux: array[1..2048] of byte; begin assign(f,'antiguo.dat'); reset(f,1); assign(g,'nuevo.dat'); rewrite(g,1); repeat blockread(f,aux,SizeOf(aux),res_f); blockwrite(g,aux,res_f,res_g) until (res_f=0) or (res_f<>res_g); close(f); close(g) end. (* Tambien realiza una copia del archivo antiguo.dat *) program copia_archivo_2; var f,g: file; res_f,res_g: word; aux: array[1..1024] of real; begin assign(f,'antiguo.dat'); reset(f,256); assign(g,'nuevo.dat');

Archivos

111

rewrite(g,256); repeat blockread(f,aux,24,res_f); blockwrite(g,aux,res_f,res_g) until (res_f=0) or (res_f<>res_g); close(f); close(g) end.

La nica diferencia entre los dos programas anteriores estriba en el tamao de los bloques de datos que manipulan. En el primer programa el tamao de 1 byte y en el segundo es de 256 bytes. Nota: SizeOf(aux) es una funcin estndar de TurboPascal que devuelve el tamao de la variable aux en bytes.

Bibliografa bsica Garca-Beltrn, A., Martnez, R. y Jan, J.A. Mtodos Informticos en TurboPascal, Ed. Bellisco, 2 edicin, Madrid, 2002 Wirth, N. Algoritmos + Estructuras de Datos = Programas, Ediciones del Castillo, Madrid, 1986 Kruse, R. Estructuras de Datos y Diseo de Programas, Prentice-Hall, 1988 Joyanes, L. Fundamentos de programacin, Algoritmos y Estructuras de Datos, McGrawHill, Segunda edicin, 1996 Duntemann, J. La Biblia de TurboPascal, Anaya Multimedia, Madrid, 1991

S-ar putea să vă placă și