1.7 Entrada/Salida Ficheros de texto
Sesión Prevista para el 12 Diciembre 2008

 

1.7.1 La lectura de grandes cantidades de datos por teclado no tiene sentido
1.7.2 Etapas a seguir para usar un fichero de texto como entrada en un programa en Pascal
1.7.3 Sintaxis de la sentencia Readln para entrada de datos con ficheros de texto
1.7.4 Lectura de grandes cantidades de datos de un fichero de texto con bucle WHILE.
1.7.5 Escritura en un fichero de texto
1.7.6 Ejercicios propuestos

1.7.1 La lectura de grandes cantidades de datos por teclado no tiene sentido

El siguiente programa calcula la media de cualquier tabla de frecuencias introducida por teclado (desconociendo a priori cuántos valores hay, pero con un valor centinela)

Program Media_N_valores_cualesquiera;
CONST centinela = -999;
VAR

N:integer;(*tamaño poblacion*)
NumValores:integer (*num valores*)
f:integer; (*frecuencia absoluta*)
x,suma,i:integer;


BEGIN

suma:=0; N:=0; NumValores :=0;
Write('Introduce un valor'); ReadLN(x);
WHILE x <> -999 DO

begin
Write('Introduce su frecuencia: ');
Readln(f);
suma:=suma+x*f;
N:=N + f; (*cálculo frec. acumulada*)
Write ('Introduce un valor: ');Readln (X);
end;

WRITELN('La media es: ',Suma/N);


END.

Copiar y pegar en FreePascal y comprobar que funciona.

No es necesario realizar la tarea tediosa de introducir por teclado cientos o miles de valores para procesarlos: para eso están los archivos o ficheros en general y, en particular, en esta sesión nos centraremos en los archivos de texto.

1.7.2 Etapas a seguir para usar un fichero de texto como entrada en un programa en Pascal

En primer lugar, para utilizar un fichero de texto en un programa, hay que escribir los datos en el fichero Y DARLE UN NOMBRE AL FICHERO (todo esto puede hacerse por ejemplo usando el Bloc de Notas de Windows).


Para entender cómo se manejan archivos de texto en un programa hay que tener en cuenta los siguientes aspectos:

  • Cada línea de un fichero de texto es una secuencia de caracteres (un string) y está marcada al final por un caracter especial llamado MARCA FIN DE LINEA (EOLN)
  • El final de un fichero está marcado por un carácter especial que se llama MARCA FIN DE FICHERO (EOF)

Por ejemplo, el fichero valores.txt en realidad se representa internamente de la siguiente manera:

[3][<eoln>]
[7][<eoln>]
[1][1][<eoln>]
[1][5][<eoln>]
[<eof>]
En este caso cada línea del archivo de texto representa UN dato a leer, por ejemplo, el valor de una variable estadística. Cada dato es de tipo entero.

y el fichero valoresyfrecs.txt de esta:

[3][<space>][2][1][<eoln>]
[7][<space>][1][0][<eoln>]
[1][1][<space>][8][<eoln>]
[1][5][<space>][3][7][<eoln>]
[<eof>]

En este caso cada línea del archivo de texto representa UN CONJUNTO DE DATOS que tienen una relación entre ellos, por ejemplo, un valor y su frecuencia absoluta asociada. En este caso los elementos se separan por espacios

Para poder utilizar los datos de estos tipos de ficheros como entrada en un programa hay que llevar a cabo los siguientes pasos:

  1. Declarar una variable en el programa de tipo "archivo de texto"
  2. Asociar el nombre de un fichero de texto almacenado en una unidad de disco a esa variable
  3. Abrir el archivo para lectura
  4. Leer los datos del archivo.
  5. Cerrar el archivo

Ejemplo de programa que lee el valor de la primera línea del fichero "valores.txt" interpretándolo como un valor entero:

Program Lee_un_valor;
Var

fichero:TEXT; (*declara la variable fichero de tipo "archivo de texto"*)
dato:integer; (*esta variable se utiliza para leer los datos del fichero*)

Begin

assign(fichero,'valores.txt'); (*asigna el nombre del fichero a la variable de fichero*)
reset(fichero); (*abre el fichero para lectura*)
readln(fichero,dato); (*lee una línea, como sólo tiene un valor lo almacena en dato*)
close(fichero); (*ya se ha leído lo que se quería, se cierra el fichero*)
writeln('El valor leido es: ', dato);

End.

Observar que se ha utilizado la sentencia readln de una forma distinta a como se ha usado hasta ahora: si queremos que los datos que se leen no vengan del teclado y provengan de un fichero, el primer parámetro de readln debe ser el fichero de entrada.

Copiar este programa y "pegarlo" en FreePascal (Usar la opción Edit>Paste FromWindows) y compilarlo. Antes de ejecutarlo, asegurarse de que el fichero valores.txt está en el mismo directorio que el programa implementado.

 

Este otro ejemplo lee la primera línea del fichero "valoresyfrecs.txt" y asigna a una distinta variable cada valor en la línea del fichero de texto

Program Lee_una_linea;
Var

fichero:TEXT; (*declara la variable fichero de tipo "archivo de texto"*)
valor:integer; (*esta variable se utiliza para leer el primer valor de una línea del fichero*)

frec:integer; (*esta variable se utiliza para leer el segundo valor de una línea del fichero*)

Begin

assign(fichero,'valoresyfrecs.txt'); (*asigna el nombre del fichero a la variable de fichero*)
reset(fichero); (*abre el fichero para lectura*)
readln(fichero,valor,frec); (*lee una línea, como tiene dos valores cada uno lo almacena en su respectiva variable*)
close(fichero); (*ya se ha leído lo que se quería, se cierra el fichero*)
writeln('El valor leido es: ', valor);

writeln('La frecuencia leida es: ', frec);

End.


Copiar este programa y "pegarlo" en FreePascal (Usar la opción Edit>Paste FromWindows) y compilarlo. Antes de ejecutarlo, asegurarse de que el fichero valoresyfrecs.txt está en el mismo directorio que el programa implementado.


1.7.3 Sintaxis de la sentencia Readln para entrada de datos con ficheros de texto
  • readln(<variable_fichero>, <lista-de-variables-de-entrada>)
    Lee datos de una línea del fichero, los asigna a las variables de la lista y salta a la siguiente línea.
  • read(<variable_fichero>, <lista-de-variables-de-entrada>)
    como readln, pero no avanza a la siguiente línea del fichero
1.7.4 Lectura de grandes cantidades de datos de un fichero de texto con bucle WHILE.

Para leer datos de ficheros utilizando bucles, es muy útil la función eof(<variable_archivo>), una FUNCIÓN BOOLEANA que devuelve TRUE cuando el puntero está colocado en la marca de fin de archivo y devuelve FALSE en otro caso

Program Lee_todos_los_datos;
Var

fichero:TEXT; (*declara la variable fichero de tipo "archivo de texto"*)
valor:integer; (*esta variable se utiliza para leer el primer valor de una línea del fichero*)

frec:integer; (*esta variable se utiliza para leer el segundo valor de una línea del fichero*)

Begin

assign(fichero,'valoresyfrecs.txt'); (*asigna el nombre del fichero a la variable de fichero*)
reset(fichero); (*abre el fichero para lectura*)
while not eof(fichero) do (*mientras no se haya llegado a fin de fichero*)

begin
readln(fichero,valor,frec); (*lee una línea, como tiene dos valores cada uno lo almacena en su respectiva variable*)
writeln('Valor: ', valor, ' Frecuencia: ',frec);
end


close(fichero); (*ya se ha leído lo que se quería, se cierra el fichero*)

End.


Copiar este programa y "pegarlo" en FreePascal (Usar la opción Edit>Paste FromWindows) y compilarlo. Antes de ejecutarlo, asegurarse de que el fichero valoresyfrecs.txt está en el mismo directorio que el programa implementado.

 

1.7.5 Escritura en un fichero de texto

También se puede escribir información en un fichero de texto, siguiendo un proceso parecido a cómo se escribe información en la pantalla mediante cadenas de texto. Para ello, hay que seguir siempre los siguientes pasos:

  1. Declarar una variable de tipo fichero de texto
  2. Asignarle un nombre de fichero.
  3. Abrir el fichero para escritura
  4. Escribir las cadenas de texto que se deseen
  5. Cerrar el fichero.

Program Escribe_en_fichero;
Var

fichero:TEXT; (*declara la variable fichero de tipo "archivo de texto"*)
valor:integer; (*esta variable se utiliza para leer un valor por teclado*)

Begin

write('Introduce un valor: '); Readln(valor);
assign
(fichero,'salida.txt'); (*asigna el nombre del fichero a la variable de fichero*)
rewrite(fichero); (*abre el fichero para escritura*)
write(fichero,'El valor introducido por teclado es: ', valor);

close(fichero); (*ya se ha escrito lo que se quería, se cierra el fichero*)

End.

Copiar este programa y "pegarlo" en FreePascal (Usar la opción Edit>Paste FromWindows) y compilarlo. Después de ejecutarlo, comprobar que el fichero salida.txt está en el mismo directorio que el programa implementado y ver su contenido.

 

 

 

 
1.7.6 Ejercicios propuestos
 
1.7.6.1 Leer valores de un fichero de texto y calcular media
1.7.6.2 Leer valores y frecuencias de un fichero de texto y calcular moda y media
1.7.6.3 Leer valores de un fichero de texto y calcular las frecuencias de aparición de los valores {4,7,9}
1.7.6.4 Escribir funciones para calcular la media, desviación típica y varianza de los datos de un fichero de texto
1.7.6.5 Hacer una función para calcular el tamaño de líneas de un fichero de texto