Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Informática II Archivos y flujos
Clase 24 Informática II Archivos y flujos
2
Almacenamiento Estamos acostumbrados a la idea que las diferentes aplicaciones que utilizamos diariamente en nuestras computadoras almacenan información como archivos. Depende del tipo de aplicación es la forma en la que la aplicación guarda los datos de modo tal de poder accederlos en un tiempo posterior. Según el tipo de información contenida en los archivos, la información contenida en los mismos se trata de diferentes maneras: Secuencial: esta metodología esta asociada fundamentalmente a los archivos de texto, donde no hay una unidad de información de tamaño definido por lo que los datos se recuperan uno después de otro sin posibilidad de “saltear” datos. Acceso aleatorio: la información se almacena en bloques de tamaño definido por lo que es posible desplazarse entre los mismos accediendo a los fragmentos de información de interés.
3
Implementaciones Cada uno de estos tipos de acceso se asocia al uso de clases o métodos específicos, ya sea en C++ o Qt. En este sentido, cabe aclarar, que la metodología de manejo de archivos propia de C++ puede utilizarse en el entorno de Qt. Mientras que las familias de clases que incorpora Qt para esto no es posible utilizarlas desde C++. Debido a esto, comenzaremos analizando la metodología de trabajo con archivo en C++ y luego veremos las alternativas propias de Qt.
4
Archivos de Acceso Secuencial y C++
La librería STL de C++ incorpora una jerarquía de plantillas que permite el acceso a los datos contenidos en archivos. Estas implementan el acceso a través de flujos. basic_ios basic_istream basic_ostream basic_ifstream basic_iostream basic_ofstream ifstream (lectura) ofstream (escritura) basic_fstream fstream (lectura y escritura)
5
Archivos de Acceso Secuencial y C++ - Apertura y cierre
Para poder trabajar con archivos con objetos de la clases ifstream, ofstream o fstream es necesario indicarle en algún momento el nombre del archivo con el que se desea trabajar y, ocasionalmente, la forma de acceso. Esto es posible a través del uso del constructor de cada una de estas clases, que toman como argumento dos cadenas de caracteres (cadenas tipo c). El primer argumento corresponde con el nombre del archivo que se desea utilizar mientras que el segundo indica el modo de apertura del archivo: Parámetro Significado ios::app Abre el archivo para escritura ubicándose al final del mismo antes de cada operación de escritura. ios::ate Abre el archivo para escritura y se ubica al final. ios::in Abre el archivo para lectura. ios::out Abre el archivo para escritura. ios::trunc Si el archivo existe, descarta su contenido. ios::binary Abre el archivo en modo entrada salida y trata la información como datos binarios.
6
Archivos de Acceso Secuencial y C++ - Apertura y cierre
Según el modo de acceso deseado sobre el archivo en cuestión será la clase que deberemos usar y los argumentos posibles para el constructor de la misma: Clase ofstream Se utiliza para acceder al archivo en modo escritura. Las variantes de acceso posibles son: ios::out, ios::app, ios:trunc ifstream Se utiliza para acceder al archivo en modo lectura. El modo de acceso por defecto es de lectura ios::in. fstream Permite el acceso en modo de lectura y escritura y son válidas todas las variantes de acceso. Es posible utilizar más de un modificador de acceso y para esto se utilizar el símbolo pipe (|), ya que cada constante tiene un valor que puede sumarse y es interpretado de modo adecuado.
7
Archivos de Acceso Secuencial y C++ - Apertura y cierre
Además de asociar un archivo del sistema de archivos con un flujo a través del constructor, también es posible utilizar un constructor sin parámetros y utilizar el método open de cada clase con los mismos argumentos que el constructor analizado anteriormente. Un detalle importante es que las clases antes mencionadas sobrecargan el operador ! de modo tal que se pueda tener conocimiento si el archivo pudo abrirse o no con las opciones indicadas. Así como en el Lenguaje C, siempre que abramos un archivo deberemos cerrarlo. Para realizar esta operación todas las clases antes mencionadas incorporan un método denominado close() con este fin.
8
Archivos de Acceso Secuencial y C++ - Escritura
Si el archivo fue abierto utilizando un objeto de la clase ofstream, las operaciones de escritura sobre el archivo pueden realizarse utilizando el operador de inserción de flujo (<<) ya que el archivo se comporta como un flujo de información. De modo similar a como cuando trabajamos con cout, y a diferencia del lenguaje c, no será necesario indicar el tipo de dato que deseamos almacenar ya que el operador de inserción está sobrecargado. ej1 ej2
9
Archivos de Acceso Secuencial y C++ - Lectura
El proceso de lectura también se realiza considerando que el archivo es un flujo, por esto se utiliza el operador de extracción de flujo para obtener los diferentes valores almacenados. Al igual que cuando trabajamos en lenguaje c, es necesario que los valores dentro del archivo se puedan distinguir. Esto es, si tenemos un conjunto de valores enteros y deseamos tratarlos como tales, es necesario que se encuentren separados uno del otro por espacios en blanco, tabulaciones o saltos de línea. También será necesario verificar que no se alcance el final del archivo, que se hallan podido leer los valores del tipo indicado y que no se hallan producido errores desconocidos. Esto se puede verificar a través de los métodos: Nombre del método Retorna verdadero si… ifstream::eof() Se alcanza el final del archivo ifstream::fail() No se pudo leer un valor del tipo indicado ifstream::bad() Se produjo un error desconocido ej3
10
Archivos de Acceso Secuencial y C++ - Lectura
Además de los métodos anteriores para determinar si se ha producido un error o nó, es posible utilizar el método good(). Este método retornará un valor verdadero si ninguna de la condiciones anteriores se ha detectado (fin de archivo, imposibilidad de leer un determinado tipo de valor, error desconocido). En el ejemplo anterior vimos como cargar valores numéricos de un archivo, ahora mostraremos por pantalla el contenido de un archivo que contiene texto. Para esto utilizaremos la función getline, esta función toma como argumentos: Un flujo de entrada. Un contendor para almacenar la cadena obtenida. De modo opcional, un carácter que indique el fin de línea. No utilizaremos el operador de extracción de flujo ya que de usarlo obtendríamos el texto por palabra y no por renglón. ej4
11
Archivos de Acceso Secuencial y C++ - Lectura
Cuando realizamos tratamos un archivo con contenido secuencial, para algunos algoritmos es necesario leer varias veces el contenido del mismo ya que no es posible conocer a priori la cantidad de información contenida. Para esto es posible utilizar los métodos seekp definido en la clase ostream (accesible a través de ofstream) y seekg definido en la clase istream (accesible a través de ifstream). Ambos nos permiten ubicarnos en una posición del archivo, la diferencia es que seekp (seek put) ubica el cursor del archivo en operaciones de escritura mientras que seekg (seek get) ubica el cursor en operaciones de lectura. Los argumentos que toman estos métodos son dos: La cantidad de bytes a desplazarse Desde donde se desea contar el valor anterior. Las posibilidades son ios::end : desde el final ios::beg : desde el comienzo ios::cur : desde la posición actual Nota: debido a que el procesamiento en general se realiza hasta que se dispara una condición de error, para volver a procesar el contenido del mismo es necesario reinicializar el estado de las banderas utilizando el método clear(), ej5
12
Archivos de acceso aleatorio C++
Los archivos de acceso aleatorio pueden ser leídos y escritos utilizando las clases ifstream, ofstream y fstream. En este caso, las operaciones de lectura y escritura deben realizarse a través de los métodos read y write que toman como argumento un puntero a char (char *), el mismo debe ser “constante” para las operaciones de escritura. Para poder escribir un valor de diferente tipo es necesario hacer una conversión utilizando el operador reinterpret_cast El segundo argumento de estos métodos será la cantidad de bytes a procesar, que debe ser consistente con el tipo de dato utilizado en la escritura o lectura. ej7
13
Archivos de acceso aleatorio C++
En un archivo de acceso aleatorio suele ser importante el posicionamiento en cualquier lugar del mismo. Para esto es posible utilizar seekg y seekp. Además es necesario conocer en que ubicación nos encontramos dentro del archivo en cuestión. Para esto es posible utilizar los métodos tellg y tellp, estos retornan un valor entero indicando en que lugar nos encontramos dentro del archivo respecto de las operaciones de escritura y lectura, respectivamente. ej8
14
Archivos y Qt En Qt, el acceso a archivos se realiza o utilizando una clase denominada QFile que implementa las funcionalidades básicas de lectura y escritura, o a través de flujos utilizando QTextStream (para flujos asociados a texto) y QDataStream (para flujos sin tipo). La metodología de trabajo es similar a la antes vista, el nombre del archivo a utilizar puede ser indicado a través del constructor de la clase QFile o a través del método setFileName. Más allá de esto es necesario invocar al método open para abrir el archivo y poder acceder a su contenido. Este método toma como argumento un valor que indica la forma en la que se desea abrir el archivo y retorna un valor booleano que indica el éxito de la operación. Los posibles argumentos del método open son: QIODevice::ReadOnly : abre el archivo solo para lectura QIODevice::WriteOnly : solo se podrá escribir en el archivo QIODevice::ReadWrite : permite lectura y escritura QIODevice::Truncate : elimina el contenido previo QIODevice::Text : indica que se trata de un archivo de texto y realiza las traducciones de caracteres necesarias.
15
Archivos y Qt QFile Un método útil de la clase es exists, es un método estático y retorna un valor boleano que indica si el nombre de archivo dado como argumento existe. De esta forma es posible conocer los parámetros con los que se debe abrir el archivo posteriormente. Al igual que con fstream y sus variantes, tras realizar las operaciones de escritura y lectura deseadas es necesario cerrar el archivo utilizado utilizando el método close(). Debido a que en general se trata con buffers, es posible hacer que las operaciones pendientes de realizarse debido a que los buffers no se han completado se ejecuten en un momento particular. Para esto puede invocarse el método flush(), este método retornará un valor booleano que indica el éxito de la operación.
16
Archivos y Qt QFile – Lectura y escritura
Las operaciones de lectura y escritura son realizadas a partir de los métodos read y write. Estos toman como argumentos la dirección de memoria de los datos a escribir y el tamaño en bytes de los mismos. En todo momento el tamaño del archivo se puede conocer a través del método size() que retorna el tamaño del archivo en bytes. Este tamaño puede ser modificado en cualquier momento (siempre que el archivo esté abierto para escritura) utilizando el método resize, que toma como argumento el nuevo tamaño del archivo. Si el nuevo tamaño es mayor al original, las nuevas posición se escribirán con el valor cero. En caso contrario el archivo será truncado al nuevo tamaño. En lo que respecta al posicionamiento dentro del archivo, este se puede lograr invocando al método seek que toma como argumento el desplazamiento desde el comienzo del mismo. El método pos(), retorna la posición actual.
17
Archivos y Qt QFile – Ejemplo
Con el objetivo de analizar un ejemplo consideremos el siguiente enunciado: Se tiene una estación meteorológica que registra diferentes variables físicas. Entre ellas se encuentran: Temperatura: un valor real de precisión simple. Velocidad del viento: un valor real de precisión simple para la velocidad y un valor entero para indicar la dirección según la tabla adjunta. Implemente una clase que permita almacenar en un archivo binario diferentes registros de las dos magnitudes antes mencionadas. Genere valores al azar para comprobar el correcto funcionamiento de esta clase. Dirección Valor Norte Noreste 1 Este 2 Sureste 3 Sur 4 Suroeste 5 Oeste 6 Noroeste 7 ej9
18
Archivos y Qt QFile y QTextStream
Cuando se desea trabajar con archivos de texto, es posible utilizar la clase QTextStream. Esta clase incorpora un constructor que toma como parámetro la dirección de memoria de un objeto QFile sobre el que se desea trabajar. Debido a esto, es necesario abrir el archivo y cerrarlo luego de realizar las operaciones de interés a través de los métodos de la clase QFile. La clase QTextStream, implementa versiones sobrecargadas del operador de inserción que permiten tratar manejar diferentes tipos de valores de manera similar a las clases ifstream y ofstream. Debido a la característica secuencial de los archivos de texto, cobra interés el método atEnd() (equivalente a eof() de iftream) que retorna un valor booleano true si se alcanza el final del archivo durante un proceso de lectura.
19
Archivos y Qt QFile – Ejemplo
Con el objetivo de analizar un ejemplo consideremos el siguiente enunciado: Desarrolle una clase que permita exportar los datos contenidos en un archivo binario como el indicado a un archivo de texto. La exportación se debe poder realizar sobre todos los datos, solo sobre datos de temperatura o solo sobre los datos de velocidad del viento. ej10
20
Archivos y Qt QTextStream Lectura
En lo que respecta a operaciones de lectura esta clase incorpora (entre otros) los siguientes métodos: QString QTextStream::readAll(): retorna un objeto QString con todo el contenido del archivo de texto. Qstring QTextStream::readLine(qint64 max=0): retorna un objeto QString con una línea de cómo máximo max caracteres. Si no se indica un máximo, se espera el carácter de fin de línea. Qstring QTextStream::read (qint64 max=0): retorna un objeto QString con la cantidad de caracteres indicados. Si no son cadenas de caracteres lo que se desea leer del archivo, el operador de extracción de flujo está sobrecargado para permitir leer diferentes tipos de valores. ej11
21
Bibliografía Como programar C++
Introducción a la programación de juegos y las Bibliotecas Boost. Sexta edición H.M. Deitel / P. J. Deitel Capítulo 17: Procesamiento de archivos Documentación del entorno de desarrollo de Qt: Clase QFile: Clase QTextStream:
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.