Algorítmica y Lenguajes de Programación Ficheros Ficheros. Introducción n n n n n n Un fichero es una unidad de información almacenada en disco a la que se asigna un identificador único. Los ficheros nos ofrecen la posibilidad de almacenar datos de una manera permanente. Pueden considerarse estructuras secuenciales en las que se almacenan datos pertenecientes a un mismo tipo: de texto (caracteres), de tipo entero, de registros (datos de los alumnos de una asignatura). Hay dos formas de acceso a los mismos: secuencial y directo. En el acceso secuencial para leer o escribir un registro es necesario pasar por todos los registros previos (de manera análoga a como se trabajaría con una cinta). En el acceso directo cada registro tiene asociada una clave que permite un acceso inmediato sin tener que recorrer previamente otros registros. 2 1 Ficheros. Notación algorítmica (i) n n En la notación algorítmica sólo se empleará el acceso secuencial. Para poder utilizar un fichero es necesario, en primer lugar, declarar el tipo del mismo: variable ∈ fichero de tipo n Por ejemplo: numeros ∈ fichero de entero carta ∈ fichero de caracter matriculacion ∈ fichero de alumno 3 Ficheros. Notación algorítmica (ii) n n n n Una vez declarado un fichero, es posible abrirlo y cerrarlo. La primera operación prepara el fichero para poder escribir o leer del mismo; si imaginamos el fichero como una cinta esta acción colocaría la “cabeza de lectura” al comienzo de la misma. La segunda indica que las operaciones con el fichero han finalizado (los cambios se grabarán en disco). La sintaxis de ambas operaciones es la siguiente: abrir (fichero) cerrar (fichero) n Por ejemplo: abrir (matriculacion) cerrar (matriculacion) 4 2 Ficheros. Notación algorítmica (iii) n n n Una vez un fichero está abierto es posible leer y escribir datos del mismo. Los datos leídos/escritos serán del tipo básico del fichero. La sintaxis de ambas operaciones es la siguiente: leer (fichero, variable) escribir (fichero, expresión) n Por ejemplo: leer (matriculacion, datos_alumno) leer (carta, letra) escribir (matriculacion, datos_alumno) escribir (numeros, 7) escribir (carta, “Queridos Reyes Magos...”) n Cuando se ejecuta una acción de lectura/escritura la “cabeza de lectura” avanza una posición en el fichero (al siguiente entero/carácter/registro...) 5 Ficheros. Notación algorítmica (iv) n n Al leer de un fichero es necesario saber si se ha llegado al final del mismo. Existe una función lógica que indica si ya se ha alcanzado el fin de fichero: fin_fichero (fichero) n Por ejemplo: fin_fichero (matriculacion) 6 3 Ficheros. Ejemplo algorítmico (i) n Algoritmo que lee enteros mayores o iguales que 0 por teclado y los almacena en un archivo: n n n n n El algoritmo debe utilizar una variable de tipo entero para leer los números por teclado y una variable de tipo fichero de enteros para almacenar en dicho fichero los números. Al principio del algoritmo el fichero debe abrirse. Al final del algoritmo el fichero debe cerrarse. El algoritmo se basará en un bucle que leerá números mientras dichos números no sean negativos. Si el número leído es mayor o igual que 0 lo almacena en el fichero. 7 Ficheros. Ejemplo algorítmico (ii) variables numeros ∈ fichero de entero numero ∈ entero inicio escribir ‘Introduzca enteros positivos:’ numero ß 0 abrir (numeros) mientras numero ≥ 0 hacer leer numero si numero ≥ 0 entonces escribir (numeros, numero) fin si fin mientras cerrar (numeros) fin 8 4 Ficheros. Ejemplo algorítmico (iii) n Algoritmo que recorre un fichero con datos de alumnos y los muestra por pantalla: n n n n El algoritmo debe utilizar una variable de tipo fichero de registros de alumnos que almacena los datos (este algoritmo no lo ha escrito) y una variable de tipo registro para leer desde el fichero y mostrarlo por pantalla. Al principio del algoritmo el fichero debe abrirse. Al final del algoritmo el fichero debe cerrarse. El algoritmo se basará en un bucle que leerá registros del fichero mientras no se llegue al final del mismo; el contenido de cada registro leído se mostrará por 9 pantalla. Ficheros. Ejemplo algorítmico (iv) tipos alumno = tupla nombre, apellidos ∈ ∈ caracter fin tupla variables datos_alumno ∈ ∈ alumno matriculacion ∈ ∈ fichero de alumno inicio abrir (matriculacion) mientras no fin_fichero (matriculacion) hacer leer (matriculacion, datos_alumno) escribir ‘Nombre: ‘, datos_alumno.nombre escribir ‘Apellidos: ‘, datos_alumno.apellidos fin mientras cerrar (matriculacion) fin 10 5 Ficheros. Notación FORTRAN (i) n n n n FORTRAN permite manejar ficheros, sin embargo, ¡¡no tiene un tipo fichero!! Es posible utilizar ficheros de acceso secuencial y directo, nosotros sólo utilizaremos ficheros secuenciales. Para acceder a los ficheros, FORTRAN utiliza números de unidad; estos números varían entre 1 y 99 y podemos utilizar los que queramos para cada fichero a excepción del 5 y el 6 (teclado y pantalla, respectivamente). Para abrir en FORTRAN un fichero y asociarlo a un número de unidad (y a una ruta de fichero) se emplea la siguiente sintaxis: open (unit=unidad,file=ruta fichero,status=‘new’|’old’|’unknown’ ) n n El valor unknown es muy útil si no sabemos si el fichero existe (correspondería old) o existe (equivaldría a new). Por ejemplo: n Abrir el inexistente fichero carta.txt: open (unit=1, file=‘carta. txt’, status=‘ new’) n Abrir el fichero ya existente matriculacion.dat: open (unit=2, file=‘matriculacion .dat’ , status=‘old’) 11 Ficheros. Notación FORTRAN (ii) n n Para cerrar un fichero en FORTRAN se utiliza la acción: close (unidad) Por ejemplo, Para cerrar el anterior fichero carta.txt close (1) n Para cerrar el fichero matriculacion.dat close (2) n n También existen acciones de lectura y escritura con la siguiente sintaxis: read (unidad, formato) variable write (unidad, formato) expresión n n Al igual que con la entrada y salida estándar prescindiremos del formato y emplearemos el formato libre, *. Ejemplos: open (unit=1,file=’matriculacion.dat’,status=‘ old’) read (1,*) datos_alumno open (unit=2,file=’carta.txt’,status=‘old’) read (2,*) letra close (1) open (unit=1,file=’matriculacion.dat’,status=‘ old’) write (1,*) datos_alumno 12 6 Ficheros. Notación FORTRAN (iii) n n En FORTRAN también es posible saber si se ha llegado al final del mismo. Existe una función intrínseca que indica esta situación: eof (unidad) n Por ejemplo: open (unit=1,file=’matriculacion.dat’,status=‘old’) eof (1) 13 Ficheros. Ejemplos FORTRAN (i) n Programa que lee enteros mayores o iguales que 0 por teclado y los almacena en un archivo : program programa implicit none integer numero print *, 'Introduzca enteros positivos:' numero = 0 open (unit=1,file='numeros.dat',status='unknown') do while (numero>=0) read *, numero if (numero>=0) then write (1,*) numero end if end do close (1) end 14 7 Ficheros. Ejemplos FORTRAN (ii) n Programa que recorre un fichero con datos de alumnos y los muestra por pantalla: program programa implicit none type alumno character*64 nombre character*128 apellidos end type alumno type (alumno) datos_alumno open (unit=1,file=‘matriculacion .dat’,status=‘unknown’) do while (.not.eof(1)) read (1,*) datos_alumno print *,'Nombre: ',datos_alumno%nombre,'Apellidos: ',datos_alumno%apellidos end do close (1) end 15 Ficheros. Resumen 1. 2. 3. 4. 5. 6. Un fichero es una unidad de información almacenada en disco a la que se asigna un identificador único. Los ficheros son estructuras secuenciales en las que se almacenan datos pertenecientes a un mismo tipo. Hay dos formas de acceso a ficheros: secuencial y directo. En la notación algorítmica sólo existen ficheros secuenciales y para utilizar un fichero es necesario declararlo. En FORTRAN aunque existen ficheros de acceso directo no los utilizaremos; además, no existe un tipo fichero sino que se emplean números de unidad. Las operaciones básicas con un fichero son: n Apertura. Cierre. Lectura/Escritura. n Fin de fichero. n n 16 8