You are on page 1of 34

Archivos

Definicin Tipos y organizacin Archivos en C++ Archivos de texto Archivos binarios

Definicin

Un archivo o fichero es un conjunto sistematizado de informacin relacionada.


Un fichero es una coleccin de datos, estructurada en una o ms unidades de acceso.

Tipos de archivos

ASCII o de texto Binarios

El tipo de archivo es muy importante pues permite establecer o definir su organizacin y su acceso.

Organizacin de archivos
Se llama organizacin de archivos la tcnica empleada para representar y almacenar la informacin en archivos.
Existen tres tcnicas fundamentales:
Organizacin

secuencial Organizacin directa o al azar Organizacin secuencial indexada

Organizacin secuencial
Un

archivo organizado secuencialmente es el formado por una sucesin de datos relacionados, done su acceso est limitado a recorrer la secuencia desde el inicio.

Los

archivos secuenciales operan de la misma forma que la estructura de cola, el primer registro (fsico) es el primer registro escrito. La principal ventaja de la organizacin secuencial es la capacidad para acceder rpidamente al siguiente registro.

Organizacin directa

Cuando en un archivo el orden fsico no se corresponde con el orden lgico de acceso decimos que est organizado de un modo directo. Los datos se sitan en el archivo y se acceden a ellos directamente mediante su posicin. Las condiciones para que un archivo sea de organizacin directa son las siguientes: Almacenamiento en un soporte direccionable. Cada registro debe contener un campo clave. Debera haber correspondencia entre los posibles valores de la clave y las direcciones existentes en el soporte.

Organizacin directa Implementacin

Relacin posicin clave


Funciones de conversin de claves Hashing

Tablas de bsqueda - ndices

Hashing
El

mtodo hashing aumenta la velocidad de bsqueda en el que los datos no necesitan estar ordenados, ste mtodo se conoce como transformacin de claves (clave-direccin)
deseable que se cumplan en la funcin las siguientes condiciones:

Es

Distribuir las claves uniformemente entre las direcciones para evitar colisiones. Ejecucin eficiente. Utilizar el menor tamao de estructura posible.

Archivo secuencial indexado


Indexacin:

Es una forma de organizar datos de almacenamiento secundario. Tiene como objetivo fundamental organizar de manera efectiva una coleccin de registros para facilitar y agilizar su acceso.
Es un recurso para encontrar informacin. El ndice contiene una lista de temas (llaves) y nmeros de pginas donde encontraremos esos temas (campos de referencia).

ndice:

Archivos en C++

Archivos y streams

C++ reconoce y opera con un archivo simplemente como una secuencia de bytes

Un archivo finaliza ya sea con una marca de end-of-file (eof) o en un nmero de byte determinado (que determina el tamao del archivo)

Archivos y streams

Cuando un archivo se abre, se instancia un objeto archivo denominado stream a travs de una variable.
El objeto archivo es asociado a esa variable, que har de nombre lgico del archivo. Para realizar estas acciones en C++ deben incluirse las libreras <iostream> y <fstream> que contienen las clases del mismo nombre.

Jerarqua de clases stream

Apertura de archivos en C++


1) ofstream archi; archi.open ("archi.bin", ios::out | ios::app | ios::binary);

2) ofstream archi ("archi.bin", ios::out | ios::app | ios::binary);

Funciones generales para archivos

close()
Cerrar un archivo: Se encarga de vaciar los buffers que usa el archivo y desconectar la conexin entre el dispositivo de almacenamiento y el programa.

archi.close();

eof()
DevuelvePara conocer si se ha llegado al final del archivo al leerlo.

archi.eof();

Funciones generales para archivos


Controles de estado de los flujos de datos

bad() :Retorna true si ocurre una falla en las operaciones de lectura


o escritura. Por archi en caso de que tratemos de escribir en un archivo que no est abierto para escritura.

fail() Retorna true en los mismos casos que bad() y adems en caso
de que ocurra un error de formato, como tratar de leer un nmero entero y obtener una letra.

good() Es el ms genrico: Retorna false en los mismos casos en


los que al llamar a las funciones previas hubiramos obtenido true.

is_open() determina si la apertura de un archivo fue exitosa.

Archivos de texto

Se organiza la secuencia de bits de manera de formar caracteres. De esta manera funciona cin y cout, por lo que podemos utilizar los operadores de redireccin << y >>. Los caracteres pertenecen al cdigo ASCII por lo que los datos del archivo son fcilmente portables.

Archivos de texto

El acceso es secuencial y los datos no tienen que estar dispuestos en una estructura lgica.

Al no tener estuctura C++ solo identifica lneas y algunos separadores. La entrada y salida por consola es un caso especial de archivo de texto.

// EJ1: escribiendo en un archivo de texto #include <fstream.h> int main () { ofstream archi(C:\mis_cosas\ archi.txt); if (archi.is_open()) { archi << "Esto es una lnea.\n"; archi << Segunda lnea.\n"; archi.close(); } else cout << El archivo no pudo abrirse; return 0; }

// EJ1: leyendo desde un archivo de texto


#include <iostream> #include <fstream.h>
int main () { char z[256]; ifstream archi (C:\mis_cosas\ejemplo.txt"); if (! archi.is_open( )) { cout << "Error al abrir el archivo"; exit( ); } while (! archi.eof() ) { archi.getline (z,100); cout << z << endl; } archi.close(); return 0;}

El uso de getline()

getline() puede emplearse para leer lneas completas o parte una lnea de un archivo de texto. Con cstrings el formato es: archi.getline(cstr, n)

Con objetos string se debe emplear getline(archi, objstr, car)

El uso de los operadores << y >> en archivos de texto

La extraccin << e insercin >> en archivos de texto es idntica a la empleada con objetos cin y cout en modo consola.

La diferencia sustancial entre consola y archivo es la no permanencia de la informacin en el soporte. (display de video).

El uso de los operadores << y >> en archivos de texto

Se debe tener en cuenta que en la insercin (lectura desde el archivo de texto ) el espacio en blanco hace de separador de datos.

En la insercin (escritura en el archivo de texto), es fundamental considerar el uso de los manipuladores de formato para disponer la informacin de un modo fcilmente recuperable.

Archivos de texto
Caso de estudio 1: Leer las lneas de un archivo de texto e incorporarlas a un nico objeto string. Mostrar el contenido del objeto. Caso de estudio 2:
Leer los nombres y calificaciones de un grupo de estudiantes que se halan en el archivo NOTAS.TXT. Determinar el promedio de cada alumno e informarlo junto a su nombre. Lpez Andrs Los datos del archivo se disponen como lo indica el recuadro.

67 89 75 Gimelli Pablo 65 72 60 . . .

Archivos binarios
Limitacin de los archivos de texto de los datos a almacenar. Problemas en la lectura de caracteres como eof. Tamao de los elementos almacenados. Procesamiento implcito o explcito de lo que se lee.

Archivos binarios
Entrada/Salida con write y read
write es una funcin de ostream, heredada por ofstream. write ( char * variable, streamsize tamanio ); read es una funcin de istream heredada por ifstream read ( char * variable, streamsize tamanio ); variable es la direccin de un bloque de memoria donde los datos a leer estn almacenados o desde se tomarn los datos que desean escribirse. tamanio es un valor entero que especifica el nmero de bytes/caracteres a ser ledos/escritos desde/hacia el buffer. Los objetos de tipo fstream poseen ambas funciones.

Ejemplo de uso de archivos binarios


// readbin.cpp leyendo archivos binarios #include <iostream> #include <fstream.h> const char * nombre_archivo = "archi.txt"; int main () { char * buffer; long tamanio; ifstream file (nombre_archivo,ios::in|ios::binary|ios::ate); tamanio = file.tellg(); buffer = new char [tamanio]; file.seekg(0,beg); file.read (buffer, tamanio); file.close(); cout << "El archivo completo est en el buffer"; delete[] buffer; return 0;} El archivo completo est en el buffer

Archivos binarios
Se puede leer y escribir simultneamente. El aceso a cada byte es directo. El acceso es a travs de direcciones lo que hace la E/S ms rpida que en los archivos de texto. Cualquiera sea el tipo del archivo, se puede acceder con un archivo binario.

Punteros de flujo get y put


Todos los flujos de entrada y salida poseen, por lo

menos, un puntero de flujo. ifstream, como istream, tiene un puntero conocido como puntero get que apunta al elemento que ser ledo a continuacin. ofstream, como ostream, tiene un puntero llamado puntero put que apunta al lugar donde ser escrito el siguiente elemento. Finalmente fstream, como iostream, hereda ambos: get y put

Funciones para obtener posicin dentro del archivo binario


Funciones para obtener posicin

tellg()

tellp()

Estas dos funciones no admiten parmetros Devuelven un valor de tipo pos_type (de acuerdo al standard ANSIC++) que es un nmero entero y representa la posicin actual del puntero de flujo get (en el caso de tellg) o del puntero de flujo put (en el caso de tellp).

Funciones para posicionarse dentro del archivo binario

Funciones para posicionarse

seekg()

seekp()

seekg (off_type desplazamiento, seekdir direccin); seekp (off_type desplazamiento, seekdir direccin);
Ejemplo:

archi.seekp(8, ios::beg);
Direccin ios::beg ios::cur ios::end Significado Desde el inicio (begin) Desde la posicin actual (current) Desde el final

Ejemplos de uso de archivos binarios


// Ejemplo determinar el tamao de un archivo // y almacenar todos su informacin en un cstring ... const char *nom = "archi.txt";
int main () {char *datos; long tamanio; ifstream arhi(nom,ios::in|ios::binary|ios::ate); tamanio = archi.tellg(); datos = new char [tamanio]; archi.seekg(0, ); archi.read (datos, tamanio); archi.close(); cout << "El archivo est en una variable"; delete datos; return 0; }

Ejemplos de uso de archivos binarios


ejemplo 7.8. Uso de read() y write() en un archivo // que contiene nmeros flotantes ...

main() { float dato1=34.5, dato2=19.5, dato3; fstream archi(reales.dat,ios::in|ios::out|ios::binary|ios::ate); archi.write(&dato1, sizeof(dato1)); archi.write(&dato2, sizeof(dato2)); archi.seekg (sizeof(float), ios::beg); archi.read(&dato, sizeof(dato)); cout << dato; }

You might also like