Академический Документы
Профессиональный Документы
Культура Документы
De
Archivos
En C++:
<fstream>
V3.0
Ferreiras
Octubre 2009
1
¿ QUÉ ES UN ARCHIVO ?
UN PAQUETE DE INFORMACIÓN
DIGITAL IDENTIFICADO COMO
nombre.extension, GRABADO EN UN
DISPOSITIVO DE ALMACENAMIENTO
MASIVO Y PERMANENTE Y QUE PUEDE
SER RECUPERADO.
2
HASTA AHORA SOLO HEMOS
MANEJADO DATOS ALMACENADOS EN:
VARIABLES
ARREGLOS <VECTOR>
3
LAS VARIABLES Y LOS ARREGLOS
SON TODOS MEDIOS VOLÁTILES DE
ALMACENAMIENTO PORQUE SON
CREADOS Y PROCESADOS EN RAM.
4
UN ARCHIVO DE
COMPUTADORA
A BAJO NIVEL ES, SIMPLEMENTE,
UNA SECUENCIA UNIDIMENSIONAL DE
BYTES; OTRO NOMBRE ES “ARCHIVO
DIGITAL”:
5
A UN ALTO NIVEL, CONSIDERANDO
EL CONTENIDO, LOS BYTES PUEDEN
REPRESENTAR:
♦ NUMEROS ENTEROS,
♦ NUMEROS REALES,
♦ CARACTERES,
♦ PIXELES,
♦ SONIDO,
...
6
El formato de los bytes consiste en
codificar de manera apropiada la
información almacenada en el archivo. Es lo
que se conoce como formateo de
archivos. Dicho formato podrá ser público o
privado, protegido por las leyes de derechos
de patentes.
7
Cada programa, software o aplicación
crea sus archivos con su formato propio,
pudiendo variar, incluso, de una versión a
otra del mismo software ( Por Ejemplo, los
archivos de MS Office 2007 necesitan ser
convertidos previamente para ser
procesados con MS Office 2003, digamos
xlsx a xls, en Excel).
8
Normalmente, la extensión en el nombre
del archivo indicará su formato. Por Ejemplo:
Y, además, en http://www.wotsit.org/
10
Puesto que un byte da la
posibilidad de 256 combinaciones
diferentes ( 28 = 256) que están en el
rango desde 0 hasta 255, [0, 255],
cada programa, software o aplicación
establecerá el uso de estas para
codificar y decodificar los bytes
almacenados en sus archivos;
11
El Desarrollador de formatos de
archivos es el profesional de la TIC
responsable del desarrollo de
especificaciones de formatos de archivos.
Su conocimiento de C-C++ y ASML es
fundamental para su trabajo. Ver un
ejemplo en el link:
http://www.itee.uq.edu.au/~cristina/students/david/honoursThesis96/bff.htm
12
UN ARCHIVO ES ALMACENADO EN
UN DISPOSITIVO DE
ALMACENAMIENTO MASIVO Y
PERMANENTE ( MEMORIA
SECUNDARIA, ...):
♦ DISCO DURO, CD, DVD, BRD, HVD,
OM, 3DD, MEMORIA FLASH, ... ;
13
UN ARCHIVO ES PERMANENTE,
ESTO ES, PUEDE SER RECUPERADO
(LEIDO) EN CUALQUIER MOMENTO;
14
UN ARCHIVO PUEDE SER USADO,
PARA PROVEER DATOS DE ENTRADA A
UN PROGRAMA O PARA RECIBIR
DATOS DE SALIDA DE UN PROGRAMA;
O PARA AMBAS COSAS:
DISPOSITIO DE
BUFFER E/S PROGRAMA
ALMACENAMIENTO
15
PROCESAMIENTO DE
ARCHIVOS
Las operaciones típicas del procesamiento de archivo son:
Creación del archivo con un nombre especificado;
Establecer los atributos que controlan las operaciones sobre el
archivo;
Abrir el archivo para usar su contenido;
Lectura o actualización de su contenido;
Grabar a un dispositivo de almacenamiento permanente el
contenido actualizado;
Cerrar el archivo, con lo cual se pierde la posibilidad de su acceso
hasta que sea abierto de nuevo.
16
PUNTERO DE POSICIÓN EN EL
INTERIOR DEL ARCHIVO
ES UN NUMERO ENTERO POSITIVO
QUE INDICA EL PRÓXIMO BYTE A SER
LEÍDO O ESCRITO.
Próximo byte a 4
ser leído o
escrito
17
EL PUNTERO DE POSICIÓN EN EL INTERIOR
DEL ARCHIVO ESPECIFICA LA UBICACIÓN EN
EL ARCHIVO COMO UN NUMERO DE BYTES
DESDE LA UBICACIÓN INICIAL DEL ARCHIVO
(TAMBIÉN SE LE CONOCE COMO
DESPLAZAMIENTO DESDE EL INICIO DEL
ARCHIVO):
byte0 byte1 byte2 byte3 byte4
DESPLAZAMIENTO DE 5 BYTES
18
CUANDO SE ABRE O SE CREA UN
ARCHIVO ESTE PUNTERO ES CREADO
APUNTANDO A UNA POSICIÓN SEGÚN
LO INDICADO POR EL MODO DE
APERTURA;
19
RECORDAR QUE ES UN FLUJO
UNA SECUENCIA DE
CARACTERES (BYTES) QUE PUEDE
SER:
DE ENTRADA: PUEDE VENIR
DESDE UN TECLADO, ARCHIVO,
UN PROCESO, CUALQUIER OTRO
DISPOSITIVO DE ENTRADA;
20
DE SALIDA: CUANDO VA
DESTINADO A UN ARCHIVO, A UNA
PANTALLA, A UNA IMPRESORA O
CUALQUIER OTRO DISPOSITIVO DE
SALIDA.
21
¿QUE ES UN ARCHIVO PARA C++ ?
BYTES DE INFORMACIÓN
22
¿ COMO INTERPRETAR LOS
BYTES DE INFORMACIÓN ?
LO ESTABLECE EL FORMATO DEL
ARCHIVO: UN CONJUNTO DE
REGLAS QUE DETERMINAN QUÉ
SIGNIFICA CADA BYTE, ESTO ES, SI
ES UN ARCHIVO DE TEXTO O
UN ARCHIVO BINARIO.
23
ARCHIVOS DE TEXTO
CADA BYTE REPRESENTA UN
CARÁCTER ASCII-STD;
ES UN ARCHIVO SECUENCIAL NO
FORMATEADO;
PUEDEN SER ABIERTOS, LEÍDOS Y
EDITADOS CON CUALQUIER EDITOR DE
TEXTO ( notepad, edit, vi, ...)
24
ARCHIVOS BINARIOS
CADA BYTE CONTIENE UN VALOR EN
EL RANGO [0, 255] Y CON SIGNIFICADO
ÚNICO.
27
PASOS GENERALES PARA EL
USO DE UN ARCHIVO
DECLARAR UNA VARIABLE DE ARCHIVO;
ASOCIAR LA VARIABLE DE ARCHIVO A UN
ARCHIVO ALMACENADO EN UN DISPOSITIVO;
ABRIR EL ARCHIVO;
USAR EL ARCHIVO;
CERRAR EL ARCHIVO;
28
PASOS ESPECIFICOS PARA
PROCESAR ARCHIVOS CON
<fstream>
ABRIR EL ARCHIVO DEFINIENDO UN FLUJO
NUEVO ASOCIADO A ESTE Y ESPECIFICANDO
SI ES PARA LECTURA O PARA ESCRITURA;
USAR EL ARCHIVO; Aunque <fstream> contiene
un recurso que cierra el
CERRAR EL ARCHIVO; archivo antes de terminar la
ejecución es
recomendable hacerlo de
manera explícita.
29
MODOS DE ABRIR UN ARCHIVO
MODO DESCRIPCIÓN
ios::in para lectura
ios::out para escritura
ios::app Llama ios::out y escribe al final del archivo
ios::ate No llama ios::out, escribe al final del archivo
ios::trunc Borra todo el contenido actual del archivo
ios::nocreate Si el archivo no existe, retorna un error
ios::noreplace Si el archivo existe, no lo reemplaza
ios::binary Para crear archivos binarios
Para establecer mas de un modo de apertura usar el carácter |. Por
ejemplo: ios::app | ios::noreplace
30
ORIGEN DE LOS RECURSOS EN
<fstream>
ios
istream ostream
iostream ofstream
ifstream
fstream
31
fstream ADQUIERE POR HERENCIA
TODOS LOS RECURSOS DISPONIBLES
EN ios, istream, ostream, ifstream,
ofstream y iostream, COMO ES
MOSTRADO EN LA FIGURA ANTERIOR.
32
LOS RECURSOS EN <fstream> SON:
RECURSO DESCRIPCIÓN
open() conecta un flujo con un archivo en un dispositivo de
almacenamiento
get() extraer el próximo carácter de un flujo de entrada
eof() prueba por el fin de un archivo
put() inserta un carácter en un flujo de salida
close() desconecta un flujo del dispositivo asociado
LA FORMA GENERAL DE USO SE MUESTRA EN LOS SIGUIENTES
EJEMPLOS.
33
FORMATO DE USO DE
<fstream>
fstream id_buffer( id_archivo, modo_apertura1, | modo_apertura2 | ...);
....
return 0;
buffer
}
35
SE DEBE ESPECIFICAR QUE ES
PARA LECTURA
LEER
#include <fstream>
using namespace std;
PROGRAMA
int main(void){
fstream leer(“arch2.dat”, ios::in, ... );
arch1
....
return 0;
} buffer
36
MANEJO DE ARCHIVOS
SECUENCIALES
(ARCHIVOS DE TEXTO ASCII),
CON <fstream> EN C++
37
USAR EL OPERADOR DE INSERCIÓN
<< Ó LA FUNCIÓN put() PARA ESCRIBIR
LOS REGISTROS;
USAR EL OPERADOR DE
EXTRACCIÓN >> Ó LAS FUNCIONES
get(), getline(id_buffer, cadena, [delimi])
PARA LEER LOS REGISTROS;
38
Ejemplo de escritura usando el
operador de inserción <<
/*
asescr0.cpp
Compilador: bcc32 5.5
*/
39
#include <fstream>
using namespace std;
int main(void){
fstream escribir("fff.dat", ios::out);
escribir << endl << "Escritura de archivo de texto" << endl;
escribir << endl << "Usando los recursos de fstream" << endl;
escribir.close();
return 0;
}
40
C:\Borland\BCC55\Bin>asescr0
41
Otro ejemplo de escritura usando el
operador de inserción <<
/*
asescr0a.cpp
Compilador: bcc32 5.5
*/
42
#include <fstream>
using namespace std;
int main(void){
43
NOTA: Cada vez que corro asescr0a se agrega un
registro al archivo arch1.dat
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
44
C:\Borland\BCC55\Bin> type arch1.dat
45
Otro ejemplo de escritura usando el
operador de inserción <<
/*
asescr0b.cpp
Compilador: bcc32 5.5
*/
46
#include <fstream>
#include <iomanip>
#include <vector>
int main(void){
fstream Escritura("salida.dat");
vector<float> num(10, 5.5);
47
Escritura.precision(2);
for( unsigned int k(0); k < num.size(); k++ ){
Escritura << setw(5) << (num.at(k) + 1.5*k);
}
Escritura.close();
cout << "\nEL ARCHIVO salida.dat YA ESTA CREADO..."
<< "\n\nPUEDES VER SU CONTENIDO CON type salida.dat"
<< endl << endl;
return 0;
}
48
/*
C:\Borland\BCC55\Bin>asescr0b
usando type:
C:\Borland\BCC55\Bin>type salida.dat
5.5 7 8.5 10 12 13 14 16 18 19
*/
49
Ejemplo de escritura usando put()
/*
asput0.cpp
Compilador: bcc32 5.5
*/
50
#include <fstream>
using namespace std;
int main(void){
escribir.close();
return 0;
51
C:\Borland\BCC55\Bin> asput0
#
&
(
)
F
E
^Z
^Z
C:\Borland\BCC55\Bin>type ggg.dat
#&()FE
C:\Borland\BCC55\Bin>
52
Ejemplo de lectura usando el
operador de extracción >>
/*
asleer0a.cpp
Compilador: bcc32 5.5
*/
53
#include <fstream>
using namespace std;
int main(void){
string palabra;
fstream leer("fff.dat", ios::in);
while(!leer.eof()){
leer >> palabra; // lee palabra por palabra
cout << palabra << endl; // muestra palabra
}
leer.close();
return 0;
}
54
C:\Borland\BCC55\Bin>asleer0a
Escritura
de
archivo
de
texto
Usando
los
recursos
de
fstream
fstream
55
Ejemplo de lectura con get()
/*
asleer0b.cpp
Compilador: bcc32 5.5
*/
56
#include <fstream>
using namespace std;
int main(void){
fstream leer("arch1.dat", ios::in);
char car;
while( !leer.eof() ){
leer.get(car);
cout << car;
}
leer.close();
return 0;
}
57
==> En este momento arch1.dat solo tiene un registro a leer
C:\Borland\BCC55\Bin>asleer0b
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
C:\Borland\BCC55\Bin>asescr0a
58
==> En este momento arch1.dat tiene mas de un registro a leer
C:\Borland\BCC55\Bin>asleer0b
59
Ejemplo de lectura usando el recurso
getline
/*
asleer0c.cpp
Compilador: bcc32 5.5
*/
60
Abre el archivo fff.dat para
int main(void){ lectura sin verificar su
existencia. Otros
string linea; métodos mas
fstream leer("fff.dat", ios::in); adelante.
while(!leer.eof()){
getline(leer, linea);
cout << linea << endl; // quitar endl y probar
}
leer.close();
return 0;
}
61
C:\Borland\BCC55\Bin>asleer0c
62
Otro ejemplo de lectura usando el
recurso getline
/*
asleer0d.cpp
Compilador: bcc32 5.5
*/
63
#include <fstream>
using namespace std;
int main(void){
string line;
fstream leer(“fff.dat”, ios::in);
if( leer ){
while( !leer.eof() ){ // Verifica la apertura
getline( leer, line);
cout << line;
}
}
else{
cout << “\nERROR ABRIENDO EL ARCHIVO DE TEXTO\n”;
exit(1);
}
leer.close();
return 0; 64
}
C:\Borland\BCC55\Bin>asleer0d
65
Ver en los ejemplos código más
elaborado para el procesamiento de
entrada y salida usando archivos de
texto ascii
66
ARCHIVOS BINARIOS
CADA BYTE CONTIENE UN VALOR EN
EL RANGO [0, 255] Y CON SIGNIFICADO
ÚNICO.
69
MANEJO DE ARCHIVOS
BINARIOS (ARCHIVOS DE
ACCESO ALEATORIO),
CON <fstream> EN C++
70
ESPECIFICAR SI ES ios:out, ios::in
ó ambos;
USAR read() PARA LEERLO;
USAR write() PARA ESCRIBIRLO;
71
RECURSO A USAR EN
ARCHIVOS BINARIOS
FUNCIÓN DESCRIPCIÓN
get() lee un byte y apunta al siguiente byte a ser leido
put() escribe un byte y apunta al siguiente byte para escritura
read() lee un bloque de bytes
write() escribe un bloque de bytes
seekg() va a una posición específica para ser leída
seekp() va a una posición específica para ser escrita
tellg() retorna la posición actual del puntero interno de
lectura_escritura, el cual solo funciona cuando se lee o se
escribe
tellp() retorna la posición actual del puntero interno de
lectura_escritura
flush() graba los datos desde el buffer al dispositivo de
almacenanmiento en que esta el archivo en proceso
72
Ejemplo de uso de put() y get() con
archivos binarios
/*
abescrlect0.cpp
Compilador: bcc32 5.5
*/
73
#include <fstream>
using namespace std;
int main(void){
char car('F');
fstream escr_leer("arch3.dat", ios::out | ios::in | ios::binary);
if( escr_leer ){
escr_leer.put(car);// escribe el contenido de car en el archivo
escr_leer.seekg(ios::beg);// va al principio del archivo
escr_leer.get(car);// lee el caracter apuntado
cout << endl << car << endl;// muestra el caracter leido
}
else{
cout << "\nERROR ABRIENDO EL ARCHIVO DE TEXTO\n";
exit(1);
}
escr_leer.close();
return 0;
}
74
/*
C:\Borland\BCC55\Bin> abescrlect0
C:\Borland\BCC55\Bin>type arch3.dat
F
*/
75
Ejemplo de uso de write y read en
archivos binarios
/*
abescrlect0a.cpp
Compilador: bcc32 5.5
*/
76
#include <fstream>
using namespace std; file7.cpp
int main(void){
77
/*
C:\Borland\BCC55\Bin> abescrlect0a
Archivos binarios solo como texto.
*/
78
Otro ejemplo de uso de write y read en
archivos binarios
/*
abescrlect0b.cpp
Compilador: bcc32 5.5
*/
79
#include <fstream>
using namespace std;
int main(void){
system("cls");
double num(123.456), x; //
fstream escr_leer("arch4.bin", ios::out | ios::in | ios::binary);
if( escr_leer ){
escr_leer.write((char*)(&num), sizeof(num));
escr_leer.seekg(ios::beg);
escr_leer.read( (char*)(&x), sizeof(x));
cout << x << endl;
}
else{
cout << "\nERROR ABRIENDO EL ARCHIVO DE TEXTO\n";
exit(1);
}
escr_leer.close();
return 0;
}
80
/*
C:\Borland\BCC55\Bin> abescrlect0b
123.456
C:\Borland\BCC55\Bin>type arch4.bin
Obsérvese este
w¥ƒ resultado al intentar
leerlo como archivo de
C:\Borland\BCC55\Bin> texto
*/
81
PROCESAMIENTO SECUENCIAL
DE ARCHIVOS BINARIOS
VER LOS
EJEMPLOS
abescrsec1.cpp
ablectsec1.cpp
82
ACCESO ALEATORIO
El acceso aleatorio lo hacemos
usando los recursos de asociados al
puntero de archivo:
tellg
LECTURA
seekg
tellp
ESCRITURA
seekp
83
Tener en cuenta que los registros en
el archivo están en este orden:
...
R1 R2 R3 R4 R5 R6 R7 R8 R9 ...
84
VER LOS
EJEMPLOS
- abescrdir1.cpp
- ablecdir1.cpp
85
Ver en los ejemplos código más
elaborado para el procesamiento de
entrada y salida usando archivos
binarios.
86
EJEMPLOS
INF510_archivos1.zip
87
PROYECTO
FINAL
INF510_PF1.doc
88
Sistemas de Gestión de
Archivos de Datos (SGAD)
Conjunto de archivos creados dentro
de las aplicaciones y de acuerdo a los
requerimientos puntuales específicos que
incluye la definición en detalle de estos
archivos para poder operar sobre estos;
89
INCONVENIENTES DE LOS
SISTEMAS DE GESTION DE
ARCHIVOS DE DATOS
Redundancia e inconsistencia de los
datos: Se produce porque los archivos
son creados por distintos programas y van
cambiando a lo largo del tiempo;
90
Los archivos pueden tener distintos
formatos y los datos pueden estar
duplicados en varios sitios.Por ejemplo:
La cédula de una persona puede
aparecer en más de un archivo;
91
La redundancia aumenta los costes de
almacenamiento y acceso, y trae
consigo la inconsistencia de los datos:
las copias de los mismos datos no
coinciden por aparecer en varios
archivos.
92
Dependencia física-lógica de los
datos: La estructura física de los datos
(definición de archivos y registros) se
encuentra codificada en los programas de
aplicación. Cualquier cambio en esa
estructura implica al programador
identificar, modificar y probar todos los
programas que manipulan esos archivos.
93
Dificultad para tener acceso a
los datos: La proliferación de
programas, cada vez que se necesite
una consulta que no fue prevista en el
inicio implica la necesidad de
codificar el programa de aplicación
necesario. No permiten recuperar los
datos necesarios de una forma
conveniente y eficiente.
94
Separación y aislamiento de los
datos: Al estar repartidos en varios
archivos, y tener diferentes formatos, es
difícil escribir nuevos programas que
aseguren la manipulación de los datos
correctos. Antes se deberían sincronizar
todos los archivos para que los datos
coincidiesen.
95
Dificultad para el acceso
concurrente: Es complicado que los
usuarios actualicen los datos
simultáneamente. Las actualizaciones
concurrentes pueden dar por resultado
datos inconsistentes, ya que se puede
acceder a los datos por medio de
diversos programas de aplicación.
96
Dependencia de la estructura del
archivo con el lenguaje de programación:
La estructura se define dentro de los
programas. Esto implica que los formatos de
los archivos sean incompatibles. La
incompatibilidad entre archivos generados
por distintos lenguajes hace que los datos
sean difíciles de procesar.
97
Problemas en la seguridad de los
datos: Resulta difícil implantar
restricciones de seguridad pues las
aplicaciones se van añadiendo al sistema
según se van necesitando.
98
Problemas de integridad de datos:
Por ejemplo, no se puede insertar una
nota de un alumno en una asignatura si
previamente esa asignatura no está
creada. Otro ejemplo, las unidades en
almacén de un producto determinado no
deben ser inferiores a una cantidad.
99
Los valores almacenados en los archivos
deben cumplir con restricciones de
consistencia.
100
DE LOS SGAD A LOS SGBD
Todos los inconvenientes indicados
hicieron posible el fomento y desarrollo de
los Sistemas de Gestión de Bases de
Datos (SGBD). El objetivo primordial de
un SGBD es proporcionar eficiencia y
seguridad a la hora de extraer o
almacenar información en las Bases de
Datos (BD).
101
Los SGBD están diseñados para
gestionar grandes bloques de
información, que implica tanto la
definición de estructuras para el
almacenamiento como de mecanismos
para la gestión de la información.
102
Un SGBD es optimizado para usar
criterios de búsquedas complejas para
localizar y extraer archivos específicos que
contienen muchas piezas de información
permitiendo presentar esta el múltiples y
complejos formatos al usuario.
103
Una BD es un gran almacén de datos
que se define una sola vez; los datos
pueden ser accedidos de forma
simultánea por varios usuarios; están
relacionados y existe un número mínimo
de duplicidad; además en las BD se
almacenarán las descripciones de esos
datos.
104
El SGBD es una aplicación que permite
a los usuarios definir, crear y mantener la
BD y proporciona un acceso controlado a
la misma. Ejemplos de SBSD son, entre
muchos otros, mySQL, ORACLE, SQL
Server, PostgreSQL, InterBase, ...
105
SISTEMA DE GESTION DE
ARCHIVOS DEL SO
106
Es usado por el SO para organizar y
darle seguimiento (almacenamiento y
recuperación) a los archivos en los
dispositivos de almacenamiento
secundario. Aunque el SO provee su
propio sistema de gestión de archivos este
se puede adquirir comprándolo. También
los hay gratis.
107
Ejemplos de sistemas de gestión
de archivos del SO son FAT32 y
NTFS para Windows, ext2, ext3 y
FAT32 para Linux, UFS, ext2, ext3 y
ZFS para Unix, HFS para Macs.
108
EJEMPLO DE UN SISTEMA JERÁRQUICO DE ARCHIVOS
109
EJEMPLO DE UN SISTEMA JERÁRQUICO DE ARCHIVOS
110
GRACIAS!
111