miércoles, 21 de noviembre de 2007

Tema 9: Ficheros

Introducción

Definición de fichero (o archivo): Es un conjunto de información que se almacena en algún medio de escritura que permita ser leído o accedido por un equipo informático.

Un fichero es identificado por un nombre y la descripción de la carpeta o directorio que lo contiene. Los ficheros informáticos se llaman así porque son los equivalentes digitales de los ficheros en tarjetas, papel o microfichas del entorno de oficina tradicional. Los ficheros informáticos facilitan una manera de organizar los recursos usados para almacenar permanentemente información dentro de un equipo informático.

Ficheros en Ruby

Ruby define una sola clase base, IO, para gestionar toda la entrada y salida. De esta clase base heredan File y BasicSocket, para dar un comportamiento más especializado, pero los principios se mantienen iguales para todos.

La clase File

Permite trabajar con los ficheros.

Como era de esperar, se puede crear un nuevo objeto de fichero con

File.new

unFichero=File.new("ficheroprueba","r")

#...procesar el fichero

unFichero.close

Parámetros:

File.new(nombre_del_fichero,modo_de_acceso)

Debemos especificar qué es lo que queremos hacer con el fichero. Por defecto abren en modo lectura.

Los modos de acceso al fichero son los siguientes:

r Sólo lectura, poniendo el puntero de lectura al principio (por defecto).

r+ Lectura/escritura,empezando por el principio del fichero.

w Sólo escritura. Borra el contenido del fichero si existe o crea uno nuevo en caso contrario

w+ Lectura/escritura. Borra el contenido del fichero si existe o crea uno nuevo en caso contrario

a Sólo escritura. Sitúa el puntero al final del fichero si existe. Si no, lo crea.

a+ Lectura/escritura, poniendo el puntero al final del fichero si existe. Crea uno nuevo en el caso de que no exista

b (Sólo en DOS/Windows) Modo binario. Puede aparecer con cualquiera de los anteriores.

Otra forma de especificar los modos de acceso:

La clase file tiene declaradas las siguientes constantes para poder abrir el fichero de forma que se ajuste más a nuestras necesidades:


APPEND Abre el fichero en modo 'añadir'. Lo que se escriba, será al final del fichero.

CREAT Crea el fichero al abrirlo si no existe.

EXCL Al usarlo con CREAT, se lanzará una excepción si existe el fichero.

NONBLOCK Abre el fichero, pero no lo bloquea.

RDONLY Abre el fichero en modo sólo lectura

RDWR Abre el fichero en modo lectura/escritura

TRUNC Abre el fichero y borra su contenido si existe

WRONLY Abre el fichero en modo sólo lectura


Estos modos se pueden combinar mediante el operador '|' que hace un or a nivel de bit


ejemplo: file.new(“nombre”, File::APPEND|File::WRONLY)

Métodos varios

Los mismos métodos que has estado usando para la E/S “simple'' están disponibles para todos los objetos de tipo fichero. Así, gets lee una línea de la entrada de la terminal, y unFich.gets lee una línea del objeto fichero unFich.

Sin embargo, los objetos de E/S tienen una serie de métodos de acceso adicionales, pensados para hacer nuestra vida más fácil:

Por ejemplo el método File.open también abre un fichero. En su uso normal, hace lo mismo que File.new . Sin embargo, si hay un bloque asociado a la llamada, open se comporta de manera diferente: en vez de devolver un nuevo objeto File, invoca al bloque, pasándole el fichero acabado de abrir como parámetro. Cuando el bloque termina, el fichero se cierra automáticamente.

Como responsables programadores, cerramos el fichero para asegurarnos de que todos los datos que hay en memoria se escriben y que todos los recursos relacionados se liberan.

Abrir/crear ficheros:

new

open

Tratamiento de cadenas:

readline: lee una línea del fichero. Lanza una excepción si se llega al final.

gets: lee una línea del fichero. Si se llega al final de fichero devuelve nil.

puts: Escribe una línea en el fichero. Termina con un salto de línea.

write: Escribe una línea, sin introducir el salto de línea.

print: Igual que write.

Iteradores:

each_line( separador ){ bloque }: Ejecuta el bloque para cada una de las líneas. El separador se usa para identificar cada línea. Por defecto \n

IO.foreach( ruta_fichero ){ bloque }: Abre el fichero en modo lectura y ejecuta el bloque para cada línea.

IO.readlines( ruta_fichero ): Devuelve el fichero en un array


#La clase Alumno implementa las caracteristicas de un alumno, junto con la posibilidad de almacenar dicho alumno en un fichero.

class Alumno

def initialize n, a, dni
@nom = n
@ape = a
@dni = dni
end

def almacena
#El fichero se abre en modo lectura y escritura,
#poniendo el puntero al final del fichero
f = File.new("Alumnos.txt", "a+")
cadena = "#{@nom}, #{@ape}, #{@dni.to_s}"
f.puts(cadena)
f.close
end

end

#MAIN
#Creamos tres alumnos y los almacenamos en el fichero
a = Alumno.new("Ivan", "Alvarez", 53534512)
b = Alumno.new("Laura", "Nuevo", 53534512)
c = Alumno.new("Diego", "Perez", 53534512)

a.almacena
b.almacena
c.almacena

#Cargamos alumnos del fichero, y los mostramos por pantalla
puts "\nCargamos los alumnos del fichero: "
IO.foreach( "Alumnos.txt" ) do |a|
array = a.split(", ")
alumno = Alumno.new(array[0], array[1], array[2])
print "#{alumno.nom}, #{alumno.ape}, #{alumno.dni}"
end

No hay comentarios: