FICHEROS.
INDICE AULA MENTOR
Introducción
Todo lo estudiado hasta ahora sería poco útil si no existiese alguna forma de hacer que nuestros
datos se puedan guardar de forma permanente entre las distintas ejecuciones de un programa.
Hasta ahora nuestros datos desaparecían tras utilizar un programa. Sin ir más lejos, en los
programas que gestionaban los alumnos de una clase, era bastante tedioso tener que introducir
todos los datos de la clase (nombres, notas, etc.) cada vez que se necesitaba trabajar con nuestro
programa.
Esto se debe a que los datos de nuestro programa se almacenan durante la ejecución del
programa en la memoria principal del ordenador. Esta memoria es volátil, y además se libera
cuando terminamos de usar el programa.
Para evitar esto se usan los dispositivos de almacenamiento externo (o memoria secundaria). En
nuestro caso, estamos hablando de los disquetes o del "disco duro" de su ordenador. En estos la
información se organiza de forma jerárquica en ficheros.
El nombre de un fichero se compone de dos partes, nombre y extensión, separados por el
carácter punto (.). Aunque la longitud del nombre puede depender del sistema operativo que esté
usando, le recomendamos que use nombre de 8 caracteres, y tres para la extensión.
nombre.ext
La extensión se utiliza para distinguir el tipo del contenido del fichero. De esta forma, si vemos
un fichero con extensión ".c", sabremos que se trata de un fichero con un programa en lenguaje
C. Y como ya hemos observado, los ficheros que contienen programas en Pascal usan la
extensión ".pas".
Usaremos los ficheros para almacenar información como:
-Los datos de una clase.
-Valores diarios de las temperaturas: mínimo, máximo y media.
-Los datos de una consulta médica.
-etc.
Como los soportes de almacenamiento secundario son más lentos que la memoria principal, la
forma de trabajar es leer del fichero los datos con los que se va a trabajar y utilizarlos en la
memoria principal.
Estudiemos como se utilizan en Pascal los ficheros.
Para usar los ficheros es necesario definirlos primero, y a continuación usar las funciones y
procedimientos que estudiaremos a continuación.
-1-
FICHEROS. INDICE AULA MENTOR
Definición
Un fichero es una secuencia de elementos del mismo tipo. Por lo tanto para definir un fichero es
necesario determinar primero el tipo base de ese fichero. El proceso habitual es definir primero
el tipo base, y a continuación el tipo fichero.
La forma de hacerlo es:
Tipo_fichero = file of Tipo_base; (* Define un tipo de fichero de Tipo_base *)
En el siguiente ejemplo se define un tipo de datos Talumno de tipo registro, y este se utilizará
como tipo base para un tipo definido por el usuario de nombre Tfichero. Ya tenemos los tipos
definidos por el usuario. Sólo restaría definir una variable del tipo del fichero:
Const
TAMCLASE = 10;
TAMNOMBRE = 30;
TAMDNI = 13;
Type
Tpersona = record
(* Tipo que define las caracteristicas de una persona *)
nombre : string[TAMNOMBRE];
dni : string[TAMDNI];
edad : integer;
end;
Talumno = record
(* Tipo que define las caracteristicas de un alumno *)
datos : Tpersona; (* Registro anidado *)
teoria : real;
practica : real;
end;
Tfichero = file of Talumno;
(* Define un fichero de tipo base Talumno *)
Var
fichero : Tfichero;
Asignación
Es la operación de asociar un fichero físico a una variable del tipo fichero. Una vez realizada
esta asociación, utilizaremos la variable de tipo fichero para todas las operaciones relativas al
fichero físico.
assign(fichero, 'clase.dat');
-2-
FICHEROS. INDICE AULA MENTOR
Apertura
Una vez asignado un fichero a una variable tipo fichero, es necesario "abrirlo" para permitir
operaciones de lectura o escritura. Para ello es posible utilizar dos procedimientos:
*reset: Abre un archivo ya existente para una operación de lectura. Si el archivo no existe se
produce un error.
reset(fichero);
*rewrite: Crea un nuevo archivo. Si el archivo ya existe, borra su contenido.
rewrite(fichero);
Escritura
Una vez abierto el fichero, podemos escribir en él datos del tipo base del fichero. Para ello
disponemos del procedimiento write, al que se le indica en que fichero se escriben los datos:
write(fichero, var1, var2, .. varn); Si aprovechamos el código del programa de gestión de la
clase podemos crear un bucle donde se vayan guardando todos los alumnos en fichero:
for i:= 1 to numeroalumnos do
write(fichero, miclase[i]);
Lectura
Si el fichero se abrió para lectura, el procedimiento, como ya puede imaginar, es read, y la
sintaxis muy similar a la de write:
read(fichero, var1, var2, ... varn);
Partiendo del ejemplo anterior, una vez almacenada la clase en fichero, la podemos recuperar
con el bucle:
for i:= 1 to numeroalumnos do
read(fichero, miclase[i]);
-3-
FICHEROS. INDICE AULA MENTOR
Cierre de un fichero
Una vez hayamos terminado de trabajar con el fichero, es necesario cerrarlo, con el
procedimiento close, cuyo único parámetro es el fichero:
close(fichero);
Otros procedimientos
filepos
A menudo es necesario conocer en que registro del fichero abierto estamos en cada momento.
Para ello se usa el procedimiento filepos, que recibe como parámetro la variable de tipo fichero:
filepos(fichero);
Devuelve como resultado un entero que indica la posición del fichero en la que nos
encontramos. Los registros dentro de un fichero se numeran a partir de cero. Por lo tanto, si
tenemos tres registros en el fichero, se numeran de 0 a 2.
pos := filepos(fichero);
filesize
Esta función devuelve un entero que representa el número de registros que almacena un fichero:
numelem := filesize(fichero);
seek
Con este procedimiento podemos colocarnos en un registro determinado del fichero, indicando
su posición:
seek(fichero, posicion);
Si queremos modificar un registro que acabamos de leer de un fichero, como la operación de
lectura hace que avancemos al siguiente registro, deberemos retroceder una posición antes de
escribirlo de nuevo:
/* Lee un registro del fichero */
read(fichero, registro);
/* Llama a un procedimiento que modifica el registro */
modifica(registro);
/* Calcula la posición del registro leido */
pos := filepos(fichero) -1;
/* Posiciona la siguiente lectura/escritura en pos */
-4-
FICHEROS. INDICE AULA MENTOR
seek(fichero, pos);
/* Escribe el registro modificado en el fichero
en la misma posición que tenía */
write(fichero, registro);
Estudiemos ahora ejemplos de la utilización de ficheros.
Ficheros: Ejemplos de Uso
En el caso que le proponemos vamos a modificar el programa de gestión de temperaturas para
que podamos almacenar en ficheros los datos diarios.
En un sistema real los datos de lectura del termómetro posiblemente se almacenarán
automáticamente en ficheros, usando como nombre una secuencia de dígitos que incluya el día,
mes y año. De esta forma "f281299.res" representa los valores de temperaturas del día 28 de
Diciembre de 1999.
Lo que necesitamos es que nuestro programa sea capaz de leer los datos de temperatura de un
fichero para calcular medias, máximos y mínimos. Del mismo tiempo debe ser posible guardar
los datos en un fichero para su posterior lectura.
El menú principal de nuestro programa tendrá una estructura similar a:
writeln('Centro de control de medidas atmosfericas');
writeln('-----------------------------------------');
writeln;
writeln(' 1. Lectura de datos');
writeln(' 2. Presentacion de medidas');
writeln(' 3. Calculo de media, maximos y minimos');
writeln(' 5. Lectura de datos de fichero');
writeln(' 6. Guardar datos en fichero');
writeln;
writeln(' 9. Salir');
write(' Opción: ');
Para ello vamos a utilizar las siguientes constantes, tipos y variables:
Program Lab01;
Const
primhora = 1;
ulthora = 3; (* 24 *)
Type
lecturas = array[primhora..ulthora] of integer;
Tfichero = file of integer;
Var
temperatura : lecturas;
-5-
FICHEROS. INDICE AULA MENTOR
(* Almacena temperaturas cada hora *)
opc : integer;
(* Opción del menu elegida *)
nombre : string;
(* Almacena nombre del fichero de datos *)
Nos creamos una función que se encarga de guardar los datos en fichero, donde hemos
destacado en negrita los procedimientos relacionados directamente con ficheros: assign, rewrite,
write y close.
Procedure graba_fichero(nombre: string; VAR medidas :lecturas);
Var
i : integer;
fichero : Tfichero;
Begin
assign(fichero, nombre);
rewrite(fichero);
for i:= primhora to ulthora do
write(fichero, medidas[i]);
close(fichero);
End;
Del mismo modo creamos un función que lea los datos de fichero con los procedimientos
assign, reset, read y close.
También se usa la función eof, que recibe como parámetro un fichero y devuelve si hemos
alcanzado o no el final de ese fichero, y por lo tanto ya no hay más datos:
Procedure lee_fichero(nombre: string ;VAR medidas :lecturas);
Var
i: integer;
fichero : Tfichero;
Begin
i := 0;
assign(fichero, nombre);
reset(fichero);
while ( not(eof(fichero)) AND (i < ulthora) ) do begin
i := i+1;
read(fichero, medidas[i]);
end;
close(fichero);
End;
-6-
FICHEROS. INDICE AULA MENTOR
Las modificaciones a estos procedimientos en el programa principal serán:
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
graba_fichero(nombre, temperatura);
Para llamar al procedimiento de lectura será necesario que el nombre de fichero que le
indiquemos exista previamente y almacene datos del tipo base del fichero:
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
lee_fichero(nombre, temperatura);
El código completo lo puede consultar en fichC0.pas.
Pruebe a compilarlo e introducir algunos valores de temperaturas. Observe que para no hacer
tediosa la introducción de temperaturas se ha limitado el número de muestras a tres mediante la
constante ultimahora.
Una vez introducidas las temperaturas presente los resultados en pantalla, y a continuación
guarde las muestras en fichero.
Si desconfía del programa (lo cual es una postura muy razonable), termine la ejecución del
programa con la opción "Salir". A continuación compruebe si se ha creado un fichero con el
nombre que usted eligió. Si lo intenta abrir con un editor (WordPad, Bloc de Notas, . . Word,
etc.), comprobará que su contenido no es el esperado. No debe cundir el desánimo: los ficheros
con tipos no se pueden leer directamente con editores de texto.
Vuelva a ejecutar el programa. Antes de hacer nada, presente los datos (opción 2).
Evidentemente no hay datos, están a cero. Use ahora la opción leer de fichero. Teclee el nombre
previamente elegido, y compruebe que están los datos tal como usted los introdujo.
Pruebe a modificar el programa para mejorar la presentación de los datos, y para tomar un
mayor número de muestras.
(*
Tema 9: Ficheros
Programa ejemplo del uso de Tablas y FICHEROS en Pascal
Toma medidas de temperatura y humedad y calcula la media, max y minimo
*)
Program Lab01;
Const
primhora = 1;
ulthora = 3; (* 24 *)
Type
-7-
FICHEROS. INDICE AULA MENTOR
lecturas = array[primhora..ulthora] of integer;
Tfichero = file of integer;
Var
temperatura : lecturas; (* Almacena temperaturas cada hora *)
opc : integer; (* Opción del menu elegida *)
nombre : string; (* Almacena nombre del fichero de datos *)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones matemáticas !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
Function Media(medidas: lecturas): Real;
Var
i: integer;
suma: integer;
Begin
suma := 0;
for i:= primhora to ulthora do
suma:= suma + medidas[i];
Media := suma/(1.0+ulthora-primhora);
End;
Function Maximo(medidas: lecturas): Integer;
Var
i: integer;
max: integer;
Begin
max := medidas[primhora];
for i:= primhora+1 to ulthora do
if max < medidas[i] then
max := medidas[i];
Maximo := max;
End;
Function Minimo(medidas: lecturas): Integer;
Var
i: integer;
min: integer;
Begin
min := medidas[primhora];
for i:= primhora+1 to ulthora do
if min > medidas[i] then
min := medidas[i];
Minimo := min;
End;
-8-
FICHEROS. INDICE AULA MENTOR
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones E/S !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(* Funcion de lectura de resultados por pantalla *)
Procedure Lectura(VAR medidas: lecturas; tipo: string[15]);
Var
i: integer;
Begin
writeln('Introduzca los valores de ', tipo,
'(', primhora, ':00, ' ,ulthora,':00)');
for i:= primhora to ulthora do
begin
write('Medida a las ', i, ': ');
readln(medidas[i]);
end;
End;
(* Funciones de presentación de resultados en pantalla *)
Procedure Escritura(medidas: lecturas; tipo: string[15]);
Var
i: integer;
Begin
writeln('Valores de ', tipo,
'(', primhora, ':00, ' ,ulthora,':00)');
for i:= primhora to ulthora do
begin
write(i, ': ', medidas[i],' ');
end;
writeln;
End;
(* Presenta estadisticas de las muestras*)
Procedure Resultados( medidas: lecturas; tipo: string[15]);
Begin
writeln;
writeln(tipo,' media: ', Media(medidas):0:1);
writeln(tipo,' Max: ', Maximo(medidas));
writeln(tipo,' Min: ', Minimo(medidas));
writeln;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones de uso de ficheros !!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(* Almacena datos leidos en un fichero *)
Procedure graba_fichero(nombre: string; VAR medidas :lecturas);
Var
i : integer;
-9-
FICHEROS. INDICE AULA MENTOR
fichero : Tfichero;
Begin
assign(fichero, nombre);
rewrite(fichero);
for i:= primhora to ulthora do
write(fichero, medidas[i]);
close(fichero);
End;
(* Lee datos de fichero *)
Procedure lee_fichero(nombre: string ;VAR medidas :lecturas);
Var
i: integer;
fichero : Tfichero;
Begin
i := 0;
assign(fichero, nombre);
reset(fichero);
while ( not(eof(fichero)) AND (i<ulthora) ) do begin
i := i+1;
read(fichero, medidas[i]);
end;
close(fichero);
End;
(* Función que presenta menú y devuleve opción elegida *)
Function Menu: Integer;
Var
opc: integer;
Begin
repeat
writeln('Centro de control de medidas atmosféricas');
writeln('-----------------------------------------');
writeln;
writeln(' 1. Lectura de datos');
writeln(' 2. Presentación de medidas');
writeln(' 3. Cálculo de media, maximos y minimos');
writeln(' 5. Lectura de datos de fichero');
writeln(' 6. Guardar datos en fichero');
writeln;
writeln(' 9. Salir');
write(' Opción: ');
readln(opc);
- 10 -
FICHEROS. INDICE AULA MENTOR
until ( (opc>=1 and opc <=4) or (opc=9) );
Menu := opc;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! PROGRAMA principal !!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
begin
repeat
opc := Menu; (* Presenta menú por pantalla y devuelve opcion elegida*)
case opc of
1: lectura(temperatura,'Temperatura' );
2: escritura(temperatura,'Temperatura' );
3: resultados(temperatura, 'Temperatura');
5: begin
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
lee_fichero(nombre, temperatura);
end;
6: begin
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
graba_fichero(nombre, temperatura);
end;
end;
until (opc=9);
End.
Ficheros de texto
Un fichero de texto es aquel que contiene una cantidad indeterminada de cadenas de caracteres
de distintos tamaños.
Los archivos de texto se organizan en líneas separadas por el carácter fin de línea (end of line,
eol). Por lo tanto un fichero de texto es un conjunto de líneas de distinta longitud separadas por
el carácter eol. El final del fichero, al igual que en los ficheros con tipo, se marca con eof (end
of file).
Tambien se utilizan este tipo de ficheros cuando es necesario que los datos se puedan visualizar
con editores de texto. Los procedimientos para definir, leer, escribir y cerrar ficheros son muy
similares a los de ficheros con tipos.
- 11 -
FICHEROS. INDICE AULA MENTOR
Definición
En los ficheros de texto el tipo base del fichero es el tipo char. Los ficheros de texto se definen
directamente con la palabra reservada Text:
Tipo_fichero = Text; (* Define un tipo de fichero de tipo texto *)
y en un ejemplo real obtenemos:
Program Lab02;
Const
primhora = 1;
ulthora = 3; (* 24 *)
Type
lecturas = array[primhora..ulthora] of integer;
Tfichero = text;
Var
fichero : Tfichero
fichero1 : Text;
Asignar, abrir, y cerrar fichero
Son los mismos procedimientos estudiamos para archivos con tipo:
assign(fichero, 'clase.txt');
reset(fichero);
rewrite(fichero);
close(fichero);
Escritura
Aquí aparecen las primeras diferencias con los ficheros con tipo. Podemos escribir o almacenar
datos en el fichero de distintos tipos y con distintas longitudes. Recuerde que en los ficheros con
tipos todos los datos deben ser del mismo tipo: del tipo base del fichero.
write(fichero, var1, var2, ... varn);
writeln(fichero, var1, var2, ... varn);
/* guarda caracter nueva línea tras variables */
Donde var1, var2, ... varn pueden ser de distintos tipos.
Modificando el ejemplo de las medidas atmosféricas:
for i:= primhora to ulthora do
- 12 -
FICHEROS. INDICE AULA MENTOR
writeln(fichero, medidas[i], ' a las ', i);
que sería equivalente a
for i:= primhora to ulthora do begin
write(fichero, medidas[i]);
write(fichero, ' a las ');
writeln(fichero, i);
end;
Observe:
Usamos el procedimiento writeln. Este imprime una marca de fin de línea (eol) cuando ha
terminado de almacenar en el fichero todos sus parámetros.
Tenemos tres argumentos de distintos tipos.
El contenido del fichero resultante sería algo similar a:
17 a las 1
16 a las 2
15 a las 3
14 a las 4
Lectura
Al igual que en la escritura, podemos leer datos de distintos tipos con el procedimiento read y
readln. Este último provocará que una vez leídos los argumentos, se salte a la siguiente línea.
Incluso se puede ignorar el resto de la línea si quedan datos en la línea por leer y no nos
interesan:
while ( not(eof(fichero)) AND (i < ulthora) ) do begin
i := i+1;
readln(fichero, medidas[i]);
end;
Según el formato del ejemplo anterior, tras leer la temperatura y asignarla a medidas[i] se salta a
la siguiente línea, sin leer el resto de caracteres de esa misma línea: " a las ", y la hora de la
muestra.
El código completo lo puede consultar en fichD0.pas.
(*
Tema 9: Ficheros
Programa ejemplo del uso de Tablas y FICHEROS de TEXTO en Pascal
Toma medidas de temperatura y humedad y calcula la media, max y minimo
*)
Program Lab02;
Const
primhora = 1;
- 13 -
FICHEROS. INDICE AULA MENTOR
ulthora = 4; (* 24 *)
Type
lecturas = array[primhora..ulthora] of integer;
Tfichero = text;
Var
temperatura: lecturas; (* Almacena temperaturas cada hora *)
opc: integer; (* Opción del menu elegida *)
nombre: string; (* Almacena nombre del fichero de datos *)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones matemáticas !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
Function Media(medidas: lecturas): Real;
Var
i: integer;
suma: integer;
Begin
suma := 0;
for i:= primhora to ulthora do
suma:= suma + medidas[i];
Media := suma/(1.0+ulthora-primhora);
End;
Function Maximo(medidas: lecturas): Integer;
Var
i: integer;
max: integer;
Begin
max := medidas[primhora];
for i:= primhora+1 to ulthora do
if max < medidas[i] then
max := medidas[i];
Maximo := max;
End;
Function Minimo(medidas: lecturas): Integer;
Var
i: integer;
min: integer;
Begin
min := medidas[primhora];
for i:= primhora+1 to ulthora do
if min > medidas[i] then
min := medidas[i];
Minimo := min;
End;
- 14 -
FICHEROS. INDICE AULA MENTOR
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones E/S !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(* Funcion de lectura de resultados por pantalla*)
Procedure Lectura(VAR medidas: lecturas; tipo: string[15]);
Var
i: integer;
Begin
writeln('Introduzca los valores de ', tipo,
'(', primhora, ':00, ' ,ulthora,':00)');
for i:= primhora to ulthora do
begin
write('Medida a las ', i, ': ');
readln(medidas[i]);
end;
End;
(* Funciones de presentación de resultados por pantalla*)
Procedure Escritura(medidas: lecturas; tipo: string[15]);
Var
i: integer;
Begin
writeln('Valores de ', tipo,
'(', primhora, ':00, ' ,ulthora,':00)');
for i:= primhora to ulthora do
begin
write(i, ': ', medidas[i],' ');
end;
writeln;
End;
(* Presenta estadisticas de las muestras*)
Procedure Resultados( medidas: lecturas; tipo: string[15]);
Begin
writeln;
writeln(tipo,' media: ', Media(medidas):0:1);
writeln(tipo,' Max: ', Maximo(medidas));
writeln(tipo,' Min: ', Minimo(medidas));
writeln;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! Funciones de ficheros !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(* Almacena datos leidos en un fichero:
el nombre del fichero es el primer parámetro *)
Procedure graba_fichero(nombre: string; VAR medidas :lecturas);
- 15 -
FICHEROS. INDICE AULA MENTOR
Var
i : integer;
fichero : Tfichero;
Begin
assign(fichero, nombre);
rewrite(fichero);
(*
for i:= primhora to ulthora do
writeln(fichero, medidas[i], ' a las ', i);
*)
for i:= primhora to ulthora do begin
write(fichero, medidas[i]);
write(fichero, ' a las ');
writeln(fichero, i);
end;
close(fichero);
End;
(* Lee datos de fichero: el nombre del fichero es el primer parámetro *)
Procedure lee_fichero(nombre: string ;VAR medidas :lecturas);
Var
i: integer;
fichero : Tfichero;
cad : string;
hora: integer;
Begin
i := 0;
assign(fichero, nombre);
reset(fichero);
(*
while ( not(eof(fichero)) AND (i<ulthora) ) do begin
i := i+1;
readln(fichero, medidas[i]);
end;
*)
while ( not(eof(fichero)) AND (i<ulthora) ) do begin
readln(fichero, medidas[i]);
i := i+1;
end;
close(fichero);
End;
(* Función que presenta menú y devuleve opción elegida *)
Function Menu: Integer;
Var
opc: integer;
Begin
- 16 -
FICHEROS. INDICE AULA MENTOR
repeat
writeln('Centro de control de medidas atmosféricas');
writeln('-----------------------------------------');
writeln;
writeln(' 1. Lectura de datos');
writeln(' 2. Presentación de medidas');
writeln(' 3. Cálculo de media, maximos y minimos');
writeln(' 5. Lectura de datos de fichero');
writeln(' 6. Guardar datos en fichero');
writeln;
writeln(' 9. Salir');
write(' Opción: ');
readln(opc);
until ( (opc>=1 and opc <=4) or (opc=9) );
Menu := opc;
End;
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!! PROGRAMA principal !!!!!!!!!!!!!!!!!!!!!!!!!!!*)
(*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
begin
repeat
opc := Menu;
case opc of
1: lectura(temperatura,'Temperatura' );
2: escritura(temperatura,'Temperatura' );
3: resultados(temperatura, 'Temperatura');
5: begin
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
lee_fichero(nombre, temperatura);
end;
6: begin
write('Introduca el nombre del fichero de datos: ');
readln(nombre);
graba_fichero(nombre, temperatura);
end;
end;
until (opc=9);
End.
- 17 -