2. 2
Introducción
Ya aprendieron a manejar gran cantidad
de datos del mismo y diferente tipo al
mismo tiempo.
El problema es que el programa retiene
los datos mientras esté ejecutándose y se
pierden al terminar la ejecución.
La solución para hacer que los datos no se
pierdan es almacenarlos en un archivo.
Los archivos son medios que facilita el
lenguaje para almacenar los datos en
forma permanente, normalmente en los
dispositivos de almacenamiento externo.
3. 3
Introducción
Desde el punto de vista informático, un archivo es una
colección de información que almacenamos en un
soporte permanente para poder manipularla en cualquier
momento.
Esta información se almacena como un conjunto de
registros.
4. Archivos de datos
Area localizada en una unidad
secundaria de almacenamiento que
se utiliza para guardar los datos que
se utilizarán en un programa.
Programa
en C++
Input
data
file
Output
data
file
5. 5
Introducción
En C++, se utilizan streams (flujos) para gestionar la
lectura y escritura de datos. Ya conocemos dos flujos
estándar: cin y cout.
En definitiva, abrir un fichero significa definir un stream.
Dicho stream permite la transferencia de datos entre el
programa
El buffer es un área de memoria situada en la RAM
asignada al programa que abre el archivo y el fichero en
disco.
6. 6
Introducción
Flujos o streams
• Un flujo o stream permite comunicar información entre un
origen y un destino.
– El propio programa C++ es uno de los extremos de un flujo (el destino
o el origen de la información)
– El otro extremo del flujo puede ser un dispositivo físico (teclado,
pantalla, etc.) o un fichero o archivo almacenado en un dispositivo
físico de almacenamiento.
7. 7
Introducción
Ficheros o archivos de datos
• Un fichero o archivo almacena una secuencia de datos:
– < d1, d2, d3, ... , dK‐1, dK >
• Los datos de un fichero o archivo son persistentes:
– Persistencia: capacidad de que los datos sobrevivan a la ejecución del
programa y puedan ser utilizados (leídos) posteriormente
• La capacidad de un fichero o archivo no está limitada a priori:
– Los ficheros o archivos almacenan secuencias de datos de longitud
no limitada a priori (el límite lo impondrá la capacidad física del
dispositivo que lo almacene)
8. 8
Introducción
Manipulación de Ficheros
Toda transferencia de datos entre el programa y
el fichero en disco se realiza a través del buffer.
El buffer está para dar eficiencia.
Las operaciones de E/S son más eficientes:
El acceso a la memoria RAM consume menos tiempo que el acceso a un
dispositivo físico.
El buffer hace que el número de accesos al fichero físico sea menor.
El uso del buffer permite realizar operaciones de
entrada salida de forma más eficiente.
9. 9
Introducción
Organización de archivos
Archivos de acceso secuencial: los datos se
almacenan de forma consecutiva y no es posible leer un registro
directamente, es decir para leer el registro n hay que leer los n-1
registros anteriores.
Archivos de acceso aleatorio: se puede acceder a un
registro concreto sin necesidad de leer todos los anteriores.
Tipo de almacenamiento en Archivos
Archivos de texto: Los datos se almacenan usando código
ASCII y por tanto, pueden ser procesados por cualquier editor de
texto.
Archivos binarios: Los datos se almacenan en binario.
10. 10
Archivos en C++
Biblioteca de flujos
Para poder manipular archivos, C++ dispone de la
biblioteca estándar fstream (file stream) donde se
encuentran todas las funciones necesarias para abrir y
cerrar archivos, así como para realizar las operaciones
de lectura y escritura de datos en archivos.
# include <fstream.h>
Operaciones asociadas a archivos
– Abrir fichero
– Cerrar fichero
– Lectura y escritura
– Funciones de control
11. 11
Archivos en C++
Biblioteca de flujos
Para poder manipular archivos, C++ dispone de la
biblioteca estándar fstream (file stream) donde se
encuentran todas las funciones necesarias para abrir y
cerrar archivos, así como para realizar las operaciones
de lectura y escritura de datos en archivos.
# include <fstream.h>
Operaciones asociadas a archivos
– Abrir fichero
– Cerrar fichero
– Lectura y escritura
– Funciones de control
12. ARCHIVOS Y FLUJOS
En C++, un stream es un flujo de datos de una
fuente a un destino. Las fuentes y los destinos
pueden ser cualquiera de los dispositivos o
archivos de entrada/salida.
Para la entrada y la salida, hay dos flujos
diferentes llamados flujo de entrada y flujo de
salida.
flujo de entrada estándar cin
flujo de salida estándar cout
la entrada y la salida estándar son el teclado y
la pantalla del monitor, respectivamente.
13. 13
Introducción
Los flujos sobre archivos en disco vienen representados por las clases
ifstream, ofstreamy fstream, con las que es posible leer de un
archivo, escribir en un archivo o leer y escribir, respectivamente.
Estas clases heredan de fstreambasemétodos como openy close,
para abrir y cerrar la conexión con el archivo, y de las clases istreamy
ostreamlos operadores y métodos necesarios para escribir o leer.
El constructor de estas clases acepta como argumento la ruta del archivo
a abrir y, opcionalmente, unos indicadores de modo de apertura.
14. La manipulación de archivos en C++ es un
proceso de cinco pasos:
1. Incluir el header file fstream en el programa
2. Declarar las variables de tipo file stream
3. Asociar las variables con las fuentes de
input/output
4. Utilizar las variables con >>, << u otras
funciones de i/o
5. Cerrar los archivos.
15. 15
Archivos en C++
Apertura de archivos
Al igual que los flujos cin y cout, los flujos de E/S solo
pueden transferir datos en una dirección, esto significa
que se tienen que definir flujos diferentes para lectura y
escritura de datos.
Abrir el archivo para lectura o entrada
Abrir un archivo para entrada, es definir un flujo de
archivo de entrada.
16. 16
Archivos en C++
Supongamos que queremos abrir un archivo
que se llama misdatos.txt que se encuentra en
la unidad de disco a:
Hemos definido el flujo de entrada Entrada.
#include <fstream.h>
….
ifstream Entrada (“a:misdatos.txt”);
…
...
17.
18.
19.
20. 20
Archivos en C++
ifstream: It is the input file stream class. Its member function open( ) associates
the stream with a specified file in an input mode.
In addition to open(), ifstreamclass inherits the following functions from
istreamclass.
(i) get( ) (ii) getline( ) (iii) read( ) (iv) seekg( ) (iv) tellg( )
ofstream: It is the output file stream class. Its member function open( ) associates
the stream with a specified file in an output mode.
In addition to open(), ofstreaminherits the following functions from ostreamclass
(i) put( ) (ii) write( ) (iii) seekp( ), (iv) tellp( )
21. 21
Archivos en C++
fstream: It supports files for simultaneous input and output. It is derived from
ifstream, ofstreamand iostreamclasses.
The functions associated with this stream are :
1. open : This associates the stream with a specified file.
2. close : It closes the stream.
3. close all : It closes all the opened streams
4. seekg: Sets current `get' position in a stream
5. seekp: Sets current `put' position in a stream
6. tellg: Returns the current `get' position in a stream
7. tellp: Returns the current `put' position in a stream.
22. Ejemplo: Algoritmo
1. Declarar las variables
2. Abrir el archivo de input
3. Abrir el archivo de output
4. Utilizar los manipuladores de output
5. Leer el nombre del estudiante del archivo
6. Escribir en el archivo de output el nombre del
estudiante
7. Leer los scores de las cinco notas
8. Escribir los scores en el archivo de output
9. Calcular el promedio
10. Escribir el promedio en el archivo de output
11. Cerrar los archivos
23.
24. 24
Introducción
Funciones de la clase ifstream que van a ser utilizadas:
• f.open(const char nombreFichero[]) asocia el fichero al flujo <f>
• f.is_open() devuelve true si y solo si el flujo <f> está asociado a un
fichero
• f.get() lee o extrae el siguiente carácter del flujo <f> y lo devuelve
• f.eof() devuelve true si y solo si la última operación de lectura no pudo
completarse por no haber ya datos pendientes de lectura en el flujo <f>
• f.close() libera el fichero asociado al flujo <f> y lo disocia de éste
25. 25
Introducción
Escritura de datos en un fichero
Funciones de la clase ofstream que van a ser utilizadas:
• f.open(const char nombreFichero[]) asocia el fichero al flujo f
• f.is_open() devuelve true si y solo si el flujo f está asociado a un fichero
• f.put(char c) inserta en el flujo f el carácter c
28. Ejemplo: Programa en C++ donde se capturan datos desde un
archivo, se procesan, y luego se escriben en un archivo de salida
#include<iostream> // para utilizar cin cout endl
#include<fstream> //para utilizar tipos de datos ifstream y ofstream
#include<iomanip> // para los manipuladores de output
#include<string> // para poder utilizar variables del tipo “string” en el programa
29. Ejemplo: Programa en C++ donde se capturan datos desde un
archivo, se procesan, y luego se escriben en un archivo de salida
using namespace std;
int main()
{ // Paso #1
// Se declaran las variables a utilizar
ifstream inFile; //input file stream variable
ofstream outFile; //output file stream variable
double test1, test2, test3, test4, test5;
double average;
string firstName;
string lastName;
30. Ejemplo: Programa en C++ donde se capturan datos desde un
archivo, se procesan, y luego se escriben en un archivo de salida
inFile.open("test.txt"); // Paso #2
outFile.open("testavg.out"); // Paso #3
outFile << fixed << showpoint; // Paso #4
outFile << setprecision(2);
cout<< "Processing data" << endl;
inFile >> firstName >> lastName; // Paso #5
outFile << "Student Name: " << firstName
<< " " << lastName << endl; // Paso #6
31. Ejemplo: Programa en C++ donde se capturan datos desde un
archivo, se procesan, y luego se escriben en un archivo de salida
inFile >> test1 >> test2 >> test3
>> test4 >> test5; // Paso #7
outFile << "Test scores: " << setw(6) << test1
<< setw(6) << test2 << setw(6) << test3
<< setw(6) << test4 << setw(6) << test5
<< endl; // Paso #8
average = (test1 + test2 + test3 + test4
+ test5) / 5.0; // Paso #9
outFile << "average test score: " << setw(6)
<< average << endl; // Paso #10
inFile.close(); // Paso #11
outFile.close();
return 0;
}
32. 32
Archivos en C++
ASPECTOS GENERALES SOBRE E/S
Los operadores de inserción y extracción, << y >> respectivamente, están
sobrecargados para todos los tipos de datos intrínsecos, sin importar el tipo
de streamsobre el que se trabaja.
33. 33
Introducción
Todos las clases derivadas de ios heredan una serie de indicadores de
estado que nos permiten saber cómo ha quedado el streamtras la última
operación:
good(): Devuelve un valor distinto de 0 si no se ha producido ningún
error.
eof(): Devuelve un valor distinto de 0 si se ha llegado al fin de archivo.
bad(): Devuelve un valor distinto de 0 si el streamha quedado inservible.
fail(): Devuelve un valor distinto de 0 si la última operación ha fallado.
El operador ! está sobrecargado, de forma que es posible comprobar si
un streamm puede seguir utilizándose o no mediante una expresión del tipo
if(!strEntrada) hayFallo();
34. 34
Directos
En los flujos que lo permitan, es posible desplazar el puntero de
lectura/escritura con el método seekg, facilitando un desplazamiento y una
de las tres constantes siguientes:
ios::beg: El desplazamiento será absoluto.
ios::cur: El desplazamiento será relativo respecto a la posición actual.
ios::end: El desplazamiento será relativo respecto al fin de archivo.
Para determinar la posición actual en el flujo existe el método tellg.
35. 35
Directos
Condiciones para que un archivo sea de organización directa:
Almacenamiento en un soporte direccionable.
•Cada registro debe contener un campo clave.
•Debe haber correspondencia entre los posibles valores de la clave y las
direcciones existentes en el soporte.
36. 36
Directos
DIRECCIÓN ABSOLUTA O RELATIVA
•Es un soporte direccionable, cada posición se realiza por su dirección
absoluta, número de pista y número de sector de disco. Los archivos
directos manipulan direcciones relativas en lugar de absolutas esto hará al
programa independiente de la posición absoluta del archivo en el soporte.
37. 37
Directos
Características
oRegistros de longitud fija
oAcceso directo a los registros
oAccede a los registros por medio de direcciones
oUso de soporte direccionable.
38. 38
Directos
Ventajas
oLos archivos pueden insertarse sin destruir otros datos del archivo.
oPara consultar un registro en específico no es necesario accesar a todos
oTiempo de acceso optimo
oLos registros pueden actualizarse o eliminarse sin necesidad de reescribir
el archivo completo
(
39. 39
Introducción
Desventajas
oLos datos pueden ser borrados o sobrescritos accidentalmente al menos
que se tomen precauciones especiales
oRiesgo de pérdida de precisión y violación de seguridad
oUso menos eficiente de espacio de almacenamiento
oActualizar el archivo es más difícil que método secuencial
41. PARA POSICIONARME EN UN ARCHIVO DIRECTO EN EL REGISTRO N
<Fstream> .seekg((N-1)* sizeof(mPersona) )
PARA LEER
<Fstream>.read((char *) & <Vble En La que se Lee>, sizeof(<Vble En La que se Lee>))
PARA ESCRIBIR
<Fstream>.write((char *) & <Vble En La que se Lee>, sizeof(<Vble En La que se Lee>))