Archivos y
flujos en
C++ “A veces, cuando hablamos del Universo, en realidad nos
referimos a una parte muy concreta: el universo
observable. Es decir, todo aquello cuya luz ha podido
Facultad de Ingeniería llegar hasta nuestro planeta. Pero, ¿Hay algo más allá del
Industrial universo observable? ¿Sabemos el qué? ¿qué tamaño
tiene?”
Algoritmos y Programación Recuperado de:
[Link]
observable/
Fecha de visita: 7 de agosto de 2020
Entrada / Salida en C++
• Uno de los conceptos básicos de C++ es el de stream o flujo, el
cual puede definirse como un dispositivo que produce o
consume información. Un flujo esta ligado a un dispositivo
físico (memoria, disco, monitor, etc.).
• Cada vez que se ejecuta un programa C++ se abren
automáticamente tres flujos:
• cin : entrada estándar (teclado)
• cout : salida estándar (pantalla)
• cerr : salida de mensajes de error (pantalla)
Profesor: Edgar Ruiz Lizama 2/06/2023 2
Entrada / Salida en C++
En esencia abrir un archivo significa definir un flujo (stream). Este
stream permite la transferencia de datos entre el programa fuente
(*.cpp), el buffer de memoria y el archivo en disco. Ver la figura 1.
#include<iostream>
#include<fstream>
using namespace std;
Archivo o
stream buffer int main() fichero
{
. . .
return 0;
Memoria RAM }
Programa fuente: *.cpp
Figura 1: Conceptualización de un archivo.
Fuente: Elaboración propia.
Profesor: Edgar Ruiz Lizama 2/06/2023 3
Entrada / Salida en C++
C++ dispone de dos jerarquías de clases para las operaciones de entrada/salida: una de bajo nivel,
streambuf, que es utilizada por programadores expertos, y otra de alto nivel con las clases:
istream, ostream e iostream, que derivan de la clase ios. En estas clases se disponen de
variables (objetos) y métodos para controlar los flujos de entrada y de salida. Ver la figura 2.
ios
istream ostream
istrstream istream_withasign ifstream ostrstream ostream_withasign ofstream
Figura 2: Jerarquía de iostream
clases del lenguaje C++
fstream strstream stdiostream
Profesor: Edgar Ruiz Lizama 2/06/2023 4
Manipuladores de Entrada / Salida en C++
Las funciones width(), precision(), y setfill(), están declaradas
en ios y definidas en las clases istream, ostream e iostream.
La función miembro width() establece el ancho de salida de un dato.
Cuando es necesario el sistema la aumenta de modo automático.
La función miembro precision() establece el número de cifras para un
dato de salida. Cuando no se indica la precisión por default es 6 dígitos.
La función miembro fill() establece el carácter de relleno para un dato
de salida. Por default el caracter de relleno es un blanco ‘ ‘.
Profesor: Edgar Ruiz Lizama 2/06/2023 5
Manipuladores de Entrada / Salida en C++
Los manipuladores pueden tener argumentos o no tenerlos. Los manipuladores
sin argumentos (endl, flush, etc.) están definidos en iostream.h. Los que
tienen argumentos están definidos en iomanip.h. Un manipulador solo afecta
al flujo (cin, cout, etc.) al que se aplica. Ver la tabla 1.
Tabla 1: Manipuladores de entrada/salida
Manipulador Descripción
dec, hex, oct Establecer base para enteros
ws; Saltar los blancos iniciales
endl; Imprimir un ‘\n’ y vaciar el buffer de salida
flush; Se vacía el buffer de salida
setw(int w); Establecer ancho mínimo de campo
setprecision(int p); Establecer número de cifras
setfill(char c); Establecer un carácter de relleno
setios(long i) Equivalente a setf()
unsetios(int i) Equivalente a unsetf()
Profesor: Edgar Ruiz Lizama 2/06/2023 6
Entrada / Salida de archivos
Para almacenar y recuperar datos de un archivo creado en C++ se requieren tres elementos:
• Un archivo
• Un objeto en el flujo de archivos
• Un modo
Un Archivo es un conjunto de datos relacionados que se guardan físicamente bajo un nombre
único(nombre externo) en un dispositivo de memoria secundaria como discos, cintas, CD ROM,
memorias flash y similares. Al respecto vea la Figura 3.
#include <fstream> Flujo de entrada de datos
LECTURA
int main( )
{
... Flujo de salida de datos
return 0;
Figura 3: Abstracción de un }
ESCRITURA
archivo
Programa en C++ Unidad de disco
Profesor: Edgar Ruiz Lizama 2/06/2023 7
Entrada / Salida de archivos
Un Objeto del flujo de archivos permite trabajar con el archivo externo. C++ permite trabajar con
objetos de las clases ifstream y ofstream. Un objeto ifstream implica a los procedimientos de
entrada de datos; mientras que un objeto de la clase ofstream implica a los procedimientos de
salida de datos. Los objetos de flujo de archivo son el nombre interno del objeto archivo. Los objetos
de estas clases se declaran como sigue:
ifstream f1; /* f1 es el objeto de flujo de archivo para entrada */
ofstream f2; /* f2 es el objeto de flujo de archivo para salida */
Las clases ifstream y ofstream son derivadas de la clase fstream. Los objetos de flujo de
archivo tienen acceso a funciones predeterminadas o métodos definidos en sus respectivas clases.
Así; se tienen open( ) para abrir archivo, fail( ) averiguar si se realizo con éxito la conexión al
archivo y close( ) para cerrar el archivo entre otras que verá mas adelante. Todas estas
funciones conectan el nombre externo del archivo (archivo físico) con el nombre interno del archivo
(objeto del flujo dentro del programa).
Profesor: Edgar Ruiz Lizama 2/06/2023 8
Lectura y escritura de archivos
Los datos enviados al flujo de archivo de salida de datos pueden formatearse de la misma manera
que se hace con el flujo estándar de salida de datos cout. Por ejemplo, si un flujo de salida de datos
llamado arhivo_out fue previamente declarado, se puede usar la siguiente instrucción:
archivo_out << setiosflags ( ios :: fixed ) << setiosflags ( ios :: showpoint ) << setprecision (2);
dará formato a todos los datos insertados en el flujo archivo_out de la misma forma que lo harían
esos manipuladores en cout.
Al respecto se tienen:
• ios::fixed; ocasiona que el flujo extraiga todos los datos numéricos en notación convencional de
punto fijo (sin exponente).
• ios::showpoint; indica al flujo que siempre debe insertarse un punto decimal.
• setprecision(2); indica que siempre deben mostrarse dos valores decimales después del punto
decimal
Profesor: Edgar Ruiz Lizama 2/06/2023 9
Lectura y escritura de archivos
Tabla 2 Métodos de E/S de la clase fstream
Nombre del método Descripción
get(variable_de_carácter) Extrae el siguiente carácter en el flujo de insumo de datos.
getline(variable_de_cadena,int n, ‘\n’) Extrae caracteres del flujo de insumo de datos hasta que lee
n-1 caracteres o encuentra una nueva línea (termina la
peek(variable_de_caracter)
introducción de datos con un ‘\0’.
put(expresion_de _caracter)
Devuelve el siguiente carácter en el flujo de insumo de datos
sin extraerlo de ella.
putback(expresion_de_carácter) Coloca un carácter en el flujo de salida de datos
Devuelve un carácter al flujo de insumo de datos. No altera
eof(void) los datos en el archivo.
Devuelve true si se intentó leer por encima de EOF(End Of
File; fin de archivo).
ignore(int n)
Brinca los siguientes n caracteres; si se omite la n, el valor
implícito es brincar el siguiente carácter aislado.
Profesor: Edgar Ruiz Lizama 2/06/2023 10
Clasificación de archivos
Los archivos pueden clasificarse o agruparse de acuerdo a un criterio:
• Según el contenido:
1) Archivos tipo texto.- Los datos se almacenan y procesan en formato ASCII por
lo que se pueden abrir y editar por cualquier procesador de texto (MS Word,
Write, etc.).
2) Archivos tipo binario.- Los datos se almacenan y procesan en formato de bits
(paquetes de bytes).
• Según el modo de acceso:
1) Archivos de acceso secuencial.- Los datos se almacenan y procesan de modo
consecutivo; es decir para procesar el registro n se debe procesar los n-1
registros anteriores.
2) Archivos de acceso aleatorio o directo.- Es posible acceder directamente a un
registro, sin tener que procesar los registros anteriores.
Profesor: Edgar Ruiz Lizama 2/06/2023 11
Archivos e C++: Declaraciones
• Declaración de archivos de inclusión:
#include <iostream>
#include <fstream>
• Declaración de flujos:
ifstream entrada; // lectura
ofstream salida: // escritura
fstream entrada_salida; // lectura y escritura
Profesor: Edgar Ruiz Lizama 2/06/2023 12
Archivos en C++: Apertura de archivos
Función miembro open:
• void ifstream::open(const char* nombrearch, int
ios::openmode mode = ios::in);
• void ofstream::open(const char* nombrearch, int
ios::openmode mode = ios::out | ios::trunc);
• void fstream::open(const char* nombrearch, int
ios::openmode mode = ios::in | iost::out);
Profesor: Edgar Ruiz Lizama 2/06/2023 13
Archivos en C++: Apertura de archivos
Cuando se utiliza la función miembro de la clase fstream, como por ejemplo la
función fopen( ) se requiere de dos argumentos; uno el nombre externo del
archivo y otro el indicador de modo para la apertura. Al respecto ver la tabla 3.
Tabla 3: Modos de apertura dearchivo (1/2)
Modo Descripción
ios::in Abre un archivo en modo de entrada (lectura). Si el archivo no
existe, falla la apertura.
ios::out Abre un archivo en modo de salida (escritura). Si el archivo
existe, lo vacía.
ios::binary Abre un archivo en modo binario.
• Por defecto todo archivo se abre en modo texto.
• Cualquier archivo se puede abrir en modo texto o en modo
binario.
Profesor: Edgar Ruiz Lizama 2/06/2023 14
Archivos en C++: Apertura de archivos
Tabla 3: Modos de apertura de archivo (2/2)
Modo Descripción
ios::trunc Si el archivo existe, elimina o descarta su contenido.
Esta es la acción predeterminada del modo ios::out.
ios::app Realiza la escritura del archivo siempre al final de él;
esto significa que añade contendido al archivo
ios::ate existente.
ios::nocreate Abre el archivo y se sitúa al final de él (at end) .
Si el archivo no existe; entonces, se suspende la
Ios::noreplace operación y genera un error.
Crea un archivo, si existe un archivo con el mismo
nombre la operación se suspende y entonces genera
un error
Profesor: Edgar Ruiz Lizama 2/06/2023 15
Archivos en C++: Apertura de archivos
Tabla 4: Combinación de modos de apertura de un archivo
Modo Descripción
ios::in | ios::out Abre un archivo para lectura y escritura.
• Si el archivo no existe falla la apertura.
ios::in | ios::binary Abre un archivo para lectura en modo binario.
• Si el archivo no existe, falla la apertura.
ios::in | ios::out |ios::trunc Abre un archivo para lectura y escritura.
• Si el archivo no existe, lo crea.
• Si el archivo existe, lo vacía.
ios::out | ios::app Abre un archivo en modo escritura para añadir
datos.
• Si el archivo no existe, lo crea.
Profesor: Edgar Ruiz Lizama 2/06/2023 16
Archivos en C++: Apertura de archivos
Ejemplo (Apertura de archivos de entrada o lectura)
• ifstream f1, f2; // declaración del flujo
• [Link](“[Link]”);
• [Link](“[Link]”, ios::in);
Ejemplo (Apertura de archivos de salida o escritura)
• ofstream f3, f4; // declaración del flujo
• [Link](“[Link]”);
• [Link](“[Link]”, ios::out|ios::trunc);
Profesor: Edgar Ruiz Lizama 2/06/2023 17
Archivos en C++: Apertura de archivos
Ejemplo (Apertura de archivos de entrada y salida)
• fstream f1, f2;
• [Link](“[Link]”);
• [Link](“[Link]”, ios::in|ios::out);
Ejemplo (Declaración y apertura del flujo de archivo)
• ifstream f1(“[Link]”), f2(“[Link]”);
• ofstream f3(“[Link]”);
• fstream f4(“[Link]”, ios::in|ios::out);
Profesor: Edgar Ruiz Lizama 2/06/2023 18
Archivos en C++: Apertura de archivos
Probar la existencia de un archivo.
• Se utiliza la función miembro open().
• Si la función open no puede abrir un archivo, entonces el flujo tomará el
valor de false.
Ejemplo
iftream f1;
[Link](“[Link]”, ios::in);
if ( !f1 )
cerr << “Error: . . . . El archivo no se puede abrir.”<<endl;
Profesor: Edgar Ruiz Lizama 2/06/2023 19
Archivos en C++: Apertura de archivos
• Existencia de un archivo
La función is_open() devuelve true si el archivo esta abierto
y false en caso contrario.
Ejemplo
ifstream f1;
[Link](“[Link]”, ios::in);
if ( ![Link]() )
cerr << “No se puede abrir el archivo…”<< endl;
Profesor: Edgar Ruiz Lizama 2/06/2023 20
Archivos en C++: Cierre de archivos
• Así como la función open permite abrir el flujo de archivo, la
función close permite cerrar el flujo.
Ejemplo
[Link](); // cerrar el flujo f1
[Link](); // cerrar el flujo f2
[Link](); // cerrar el flujo f3
Profesor: Edgar Ruiz Lizama 2/06/2023 21
Archivos en C++: Lectura y escritura de archivos tipo texto
• La lectura y escritura de archivos de tipo texto es directa con los
operadores << , >>
• Escritura: operador de extracción de flujo <<
Ejemplo (Escritura en un archivo de texto)
// Declaración del flujo
ofstream f1;
// Apertura del archivo
[Link](``[Link]'');
// Escritura en el archivo
f1 << “Miguel Fernandez” << 18 << “\t” << 19.75 << endl;
f1 << “Final del programa”;
// Cierre del archivo
[Link]();
Profesor: Edgar Ruiz Lizama 2/06/2023 22
Archivos en C++: Lectura y escritura de archivos tipo texto
• La lectura y escritura de archivos de tipo texto es directa con los
operadores <<, >>:
• Lectura: operador de inserción de flujo >>
Ejemplo (Lectura de un archivo de texto)
char caracter; float f; int i; char cadena[80];
// Declaracion
ifstream flujo entrada;
// Apertura del arcivo
flujo [Link](”[Link]”);
// Lectura del archivo de texto: entero, real y caracter
flujo entrada >> i >> f >> caracter;
// Lee hasta que encuentra el primer caracter blanco
flujo entrada >> cadena;
// Cierre del archivo
flujo [Link]();
Profesor: Edgar Ruiz Lizama 2/06/2023 23
Archivos en C++: Archivos de tipo Binario
• Un archivo binario es aquel donde los datos se almacenan tal y como son almacenados en la
memoria del computador. En los archivos texto los datos se almacenan en modo carácter y el
computador realiza la tarea de traducirlos a lenguaje máquina para procesarlos y luego volver a
ponerlos en formato texto para que el usuario pueda interpretarlos.
• En un archivo binario la información se almacena y procesa en paquetes de n bytes. Casi
siempre esta información proviene de un registro o una estructura (struct) o de una clase
(class).
• En un archivo tipo texto el acceso a la información es secuencial; es decir desde el inicio hasta el
final. En cambio en un archivo modo binario, dado que la información se almacena en registros;
se puede acceder directamente al n-ésimo registro sin tener que pasar por los (n-1) registros
anteriores. A esto se le conoce como acceso directo o acceso aleatorio.
Profesor: Edgar Ruiz Lizama 2/06/2023 24
Archivos en C++: Archivos de tipo binario
• Lectura y escritura de archivos binarios
• Cuando se declaran flujos de las clases ofstream, ifstream, por defecto se abren en
modo texto. Para abrirlos en modo binario se debe incluir necesariamente el modo
ios::binary. Adicionalmente también se puede incluir el modo ios::out y ios::in,
respectivamente.
• Un archivo binario es una secuencia de paquetes de n bytes y se almacenan en ese
orden (Ver figura 4). C++ proporciona las funciones write (escribir) y read (leer) para
gestionar archivos en modo binario. Estas funciones permiten escribir o leer estructuras
completas dentro del archivo binario. En general para leer o escribir es necesario realizar
un cast a la estructura que se desea procesar.
Profesor: Edgar Ruiz Lizama 2/06/2023 25
Archivos en C++: Archivos de tipo binario
Cuando se trabaja con flujos binarios se usa las funciones write y read. En este caso
nos permiten escribir y leer estructuras completas (bloques de bytes).
En general, cuando se usa estas funciones se necesita realizar un casting al paquete de
datos.
0 50 100 150 200 250
desplazamientos
de bytes
50 50 50 50 50 50
bytes bytes bytes bytes bytes bytes
Figura 4: Abstracción de un archivo binario
Profesor: Edgar Ruiz Lizama 2/06/2023 26
Archivos en C++: Archivos de tipo binario
• Por ejemplo, si se declaran los objetos salida y entrada del siguiente modo.
• ofstream salida; // escribir en el flujo
• ifstream entrada;// leer desde el flujo
• Entonces la escritura y lectura se puede realizar utilizando una de las siguientes formas
equivalentes:
1. Estilo antiguo del lenguaje C:
• [Link](( char *) &nums, sizeof nums);
• [Link](( char *) &nums, sizeof nums);
Profesor: Edgar Ruiz Lizama 2/06/2023 27
Archivos en C++: Archivos de tipo binario
2. Estilo moderno del lenguaje C++:
• [Link](reinterpret_cast< const char *>(&nums), sizeof(nums));
• [Link](reinterpret_cast< char *>(&nums), sizeof(nums));
• En cualquiera de los dos casos el primer argumento de write o read es un
puntero a la dirección del objeto nums y el segundo argumento es un entero del
tipo size_t que especifica el número de bytes a escribir o leer.
• NOTA.- Las funciones write y read son de uso exclusivo en archivos binarios.
Profesor: Edgar Ruiz Lizama 2/06/2023 28
Archivos en C++: Archivos de tipo binario
Lectura de archivos binarios (1/5)
get:
• istream & get (char & caracter);
• Lee un caracter (byte) del ujo de entrada y lo almacena en el parametro
formal carácter.
• int get ();
• Lee un caracter (byte) del flujo de entrada y devuelve su código ASCII
• Se utiliza para detectar el final de archivo (eof) que se suele representar
por -1.
Profesor: Edgar Ruiz Lizama 2/06/2023 29
Archivos en C++: Archivos de tipo binario
Lectura de archivos binarios (2/5)
get:
• istream & get (char *buffer, int numero, char delimitador = ‘\n’);
• Lee caracteres del flujo de entrada y los almacena en buffer hasta que
haya leido numero - 1 caracteres o el carácter delimitador o se haya
encontrado el final del archivo.
• Se añade el caracter nulo al final de buffer.
• Si se encuentra el caracter delimitador, no es extraido, sino que
permanece en el flujo de entrada hasta la siguiente operación de
lectura.
Profesor: Edgar Ruiz Lizama 2/06/2023 30
Archivos en C++: Archivos de tipo binario
Lectura de archivos binarios (3/5)
void getline(char *buer, int numero, char delimitador = 'nn');
• Lee cadenas de caracteres, incluyendo espacios en
blanco, y las almacena en buffer.
Nota
• La diferencia entre get y getline se encuentra en que getline
almacena el caracter delimitador en la cadena, antes de añadir el
caracter nulo.
Profesor: Edgar Ruiz Lizama 2/06/2023 31
Archivos en C++: Archivos de tipo binario
Lectura de archivos binarios (4/5)
read: lee numero bytes y los almacena en buffer
• istream & read(char *buffer, int numero);
• istream & read(unsigned *buffer, int numero);
• istream & read(signed char *buffer, int numer);
Profesor: Edgar Ruiz Lizama 2/06/2023 32
Archivos en C++: Archivos de tipo binario
Lectura de archivos binarios (5/5)
istream & putback (char caracter);
• Devuelve al fujo de entrada el ultimo caracter leido.
int peek():
• Lee e l caracter actual del flujo de entrada pero no
avanza.
Profesor: Edgar Ruiz Lizama 2/06/2023 33
Archivos en C++: Archivos de tipo binario
Acceso aleatorio (1/4)
En los programas presentados hasta ahora se ha realizado operaciones secuenciales
en el archivo, ya sea para escritura ó lectura de datos, empezando por el principio y
continuando hasta el final del mismo. Las operaciones aleatorias en un archivo no
necesariamente inician por el principio del archivo, en lugar de esto, es posible
desplazarse por el contenido del archivo para realizar una operación de E/S. Para
mover los apuntadores de archivo a posiciones específicas se utilizan dos funciones:
seekg( ) coloca el apuntador de escritura de archivo en un lugar específico, y
seekp( ) mueve el apuntador de lectura a una posición específica en el archivo, la
sintaxis de las funciones es la siguiente.
• seekp(desplazamiento, posición)
• seekg(desplazamiento, posición)
Profesor: Edgar Ruiz Lizama 2/06/2023 34
Archivos en C++: Archivos de tipo binario
Acceso aleatorio (2/4)
El parámetro desplazamiento especifica la cantidad de bytes que se moverá el
apuntador de archivo, puede ser un valor positivo ó negativo. Entiéndase que positivo
es moverse hacia delante y negativo implica moverse hacia atrás; ambas operaciones
se realizan desde la posición actual del puntero o apuntador al archivo. El parámetro
posición especifica el lugar del archivo a partir del cual se moverá el apuntador de
archivo, de acuerdo a las siguientes banderas:
• ios::beg // Desde el principio del archivo
• ios::cur // Desde la posición actual del apuntador
• ios::end // Desde el fin del archivo
Profesor: Edgar Ruiz Lizama 2/06/2023 35
Archivos en C++: Archivos de tipo binario
Acceso aleatorio (3/4)
• A modo de ejemplo, sea entrada un objeto declarado como ifstream.
• [Link](30); // ir al byte 30 del archivo
• [Link](30, ios::beg); // igual que el anterior
• [Link](-5, ios::cur); // retroceder 5 bytes
• [Link](0, ios::end); // ir al final del archivo
• [Link](0); // ir al comienzo del archivo
• Cuando se desea comprobar la posición actual del puntero del archivo, se utiliza el método
tellg() para flujos de entrada. La función tellg() devuelve información de un archivo
y con frecuencia se utiliza para averiguar el número total de registros del archivo.
Profesor: Edgar Ruiz Lizama 2/06/2023 36
Archivos en C++: Archivos de tipo binario
Acceso aleatorio (4/4)
La clase ofstream permite la escritura de datos a archivo y además de las
funciones que se ha visto, tiene dos funciones miembros para el control del
posicionamiento. La función tellp() devuelve la posición actual del
puntero de salida (escritura) del archivo. De otro lado la función miembro
seekp() toma como parámetros una posición o valor de desplazamiento y
mueve el puntero de escritura a dicha posición.
Profesor: Edgar Ruiz Lizama 2/06/2023 37
Archivos en C++
Referencias
1. Bronson Gary (2007) "C++ para Ingeniería y Ciencias" 2da. Ed. Editorial Thompson S.A. México.
2. Deitel H.M. y Deitel P.J. (2015) “Como Programar en C++” 9na edición. Editorial Pearson
Universidad, México.
3. Guardati, Silvia (2007) “Estructura de datos Orientada a Objetos – Algoritmos con C++” México.
D.F. Pearson Educación de México S.A. de C.V.
4. Joyanes Aguilar, Luis; Sanchez Garcia, Lucas (2006) "Programación en C++ Un enfoque práctico -
Serie Schaum" 1ra. Ed. Editorial McGraw Hill/Interamericana de España, Madrid.
5. Ruiz, Edgar (2009) “Programación con C++” 1ra. Ed. Fondo Editorial de la UNMSM. Lima, Perú.
6. Stanley B. Lippman, Josée Lajoie, Barbara E. Moo (2013) “C++ Primer”. Fifth Edition. Addison-
Wesley U.S.
7. Stephen Prata (2012) “C++ Primer Plus”. Sixth Edition. Addison-Wesley U.S.
Profesor: Edgar Ruiz Lizama 2/06/2023 38
Archivos en C++
Contenidos
1. Introducción.
2. Manipulación de ficheros.
3. Organización de archivos.
4. Tipo de almacenamiento.
5. Biblioteca de flujos.
6. Operaciones asociadas a archivos:
Abrir fichero,
Cerrar fichero,
Lectura y escritura,
Funciones de control.
Archivos en C++
Introducción
Ya se pueden manejar gran cantidad de datos del mismo y diferente tipo
al mismo tiempo (arrays y arrays de estructuras).
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
fichero o archivo.
Los archivos son medios que facilita el lenguaje para almacenar los datos
en forma permanente, normalmente en los dispositivos de
almacenamiento estándar.
2
Archivos en C++
Introducción
Desde el punto de vista informático, un fichero es una colección de
información que almacenamos en un soporte magnético para poder
manipularla en cualquier momento.
Esta información se almacena como un conjunto de registros.
6124517 6175000 7150001 ...
registro registro registro
FICHERO
Clara Ruiz Madrid Luis Gómez Lugo ...
registro registro
Archivos en C++
Manipulación de Ficheros
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 y el fichero en
disco.
stream Buffer FICHERO
FICHERO
RAM
El buffer es un área de memoria situada en la RAM asignada al programa
que abre el archivo.
4
Archivos en C++
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:
z El acceso a la memoria RAM consume menos tiempo que el
acceso a un dispositivo físico.
z 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.
Archivos en C++
Nos centraremos solo en archivos
Organización de archivos de acceso secuencial
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.
Nos centraremos solo en
Tipo de almacenamiento en Archivos archivos de texto
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.
6
Archivos en C++
Biblioteca de flujos
Para poder manipular archivos, C++ dispone de la biblioteca estandar
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
• Para entrada o lectura
– Abrir fichero - en modo truncado
• Para salida o escritura
- en modo añadir
– Cerrar fichero
– Lectura y escritura
– Funciones de control
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.
ifstream <flujo_entrada> (“ ruta_de_localización ”) ;
Nombre lógico. Nombre
El nombre del flujo debe ser físico
Input file stream
un identificador permitido.
En el programa, nos referiremos al fichero utilizando el nombre del flujo.
8
Archivos en C++
Abrir el fichero para lectura: Ejemplo
Supongamos que queremos abrir un fichero que se llama [Link] que se
encuentra en la unidad de disco a:
#include <fstream.h>
….
ifstream leer_fich (“a:\\[Link]”);
…
...
Hemos definido el flujo de entrada leer_fich.
Archivos en C++
Abrir el archivo para escritura o salida
Abrir un archivo para salida, es definir un flujo de archivo de salida.
Existen dos posibilidades: Output file stream Nombre físico
ofstream <flujo_salida> (“ ruta_de_localización ”) ;
ofstream <flujo_salida> (“ ruta_de_localización ”, ios_base::out ) ;
Nombre lógico.
El nombre del flujo debe ser un identificador permitido.
Si se abre un archivo en modo salida y dicho archivo ya existe,
todos los datos almacenados serán sobreescritos.
Si el archivo no existe, se creará.
10
Archivos en C++
Abrir el fichero para escritura: Ejemplo
Supongamos que queremos abrir un fichero para escribir datos. Dicho fichero
se llama [Link] y se encuentra en la unidad de disco a:
#include <fstream.h>
….
ofstream fich_1 (“a:\\[Link]”);
ofstream fich_dos (“a:\\[Link]”, ios_base::out);
...
Hemos definido el flujo de salida fich_1.
Hemos definido el flujo de salida fich_dos.
11
Archivos en C++
Abrir el archivo para añadir datos al final
Si se desea añadir en lugar de reemplazar los datos de un archivo
existente, se debe definir un flujo de salida en modo append.
ofstream <flujo_salida> (“ ruta_de_localización ”, ios_base::app ) ;
Los datos adicionales escritos en el archivo, se añaden en su
extremo final.
Si el archivo no existe, se creará.
#include <fstream.h>
….
ofstream fich_tres (“a:\\[Link]”, ios_base::app);
...
Hemos definido el flujo de salida fich_tres en modo añadir.
12
Archivos en C++
Advertencia
Antes de seguir adelante, es aconsejable comprobar si el fichero se ha
abierto correctamente, tanto si es para lectura, escritura.
if (fichero_uno)
cout << ”Apertura con éxito";
else
cout << ”No se ha podido abrir el fichero";
Una vez definidos los flujos con los que va a trabajar nuestro programa,
se pueden utilizar los operadores de inserción(<<) y extracción(>>) y los
métodos ya conocidos de lectura de datos vistos para los flujos cin y
cout.
13
Archivos en C++
Cierre de archivos
Cuando el programa ha terminado de manipular el fichero, éste debe
cerrarse. Para cerrar un archivo, basta con ejecutar la función close sobre
el flujo asociado al fichero.
Nombre lógico <nombre_flujo>. close();
#include <fstream.h>
….
ifstream leer_fich (“a:\\[Link]”);
ofstream fich_1 (“a:\\[Link]”, ios_base::out);
ofstream fich_dos (“a:\\[Link]”, ios_base::app);
….
leer_fich.close();
fich_1.close();
Si un fichero no se cierra, es
fich_dos.close(); cerrado automáticamente cuando
... termina el programa
14
Archivos en C++
Lectura de archivos de texto
La lectura de un archivo de texto se puede realizar con el operador de
extracción (>>).
Apertura del fichero
#include <fstream.h>
….
ifstream leer_fich (“a:\\[Link]”);
if ( ! leer_fich) Comprobar que se ha
cout << ”No se ha podido abrir el fichero"; abierto correctamente
else
{
leer_fich >> numero;
leer_fich >> nombre; Manipular el fichero
}
….
leer_fich.close(); Cierre
...
123 Ana
El operador >> lee hasta un blanco y omite los blancos.
15
Archivos en C++
Lectura de archivos de texto
La biblioteca estándar fstream.h nos proporciona funciones para el
control de flujos. Ya las habíamos visto cuando analizamos el flujo
estándar cin.
1. Lectura de cadenas, incluyendo caracteres en blanco:
<flujo_entrada>.getline: cadena × tamaño × carácter → void
2. Lee un caráter del flujo de entrada y devuelve falso cuando se ha
alcanzado fin de fichero
<flujo_entrada>.get : char → bool
16
Archivos en C++
Escritura de archivos de texto
La escritura de un archivo de texto se puede realizar con el operador de
inserción ( <<).
#include <fstream.h> Apertura del fichero
….
ofstream write_fich (“a:\\[Link]”);
if ( ! write_fich)
cout << ”No se ha podido abrir el fichero"; Comprobar que se ha
else abierto correctamente
{
write_fich << numero; Manipular el fichero
write_fich << “ “;
write_fich << nombre; Escribe un espacio en blanco
}
….
leer_fich.close(); Cierre 123 Ana
...
17
Archivos en C++
Escritura de archivos de texto
Escribe un carácter en el flujo de salida.
<flujo_salida>.put : char → void
#include <fstream.h>
….
ifstream leer_fich (“a:\\[Link]”);
ofstream write_fich (“a:\\[Link]”);
...
Lee un carácter del flujo de entrada
leer_fich.get(car);
leer_fich.getline(nombre, 20);
write_fich.put(car);
….
leer_fich.close(); Escribe un carácter del flujo de salida
write_fich.close();
...
18
Archivos en C++
Funciones de control de flujos de archivos
La función eof, devuelve un valor distinto de cero si el flujo de entrada
ha alcanzado el final del fichero:
<flujo_entrada>.eof: → int
#include <fstream.h>
….
ifstream leer_fich (“a:\\[Link]”);
. ..
while (! leer_fich.eof() )
{
leer_fich.getline(nombre, 20);
Mientras no sea final de fichero
linea ++;
}
….
leer_fich.close();
...
19
Profesor: Dr. Edgar Ruiz Lizama
UNMSM- FACULTAD DE INGENIERIA INDUSTRIAL
ALGORITMOS Y PROGRAMACIÓN 2023-1
TEMA: RECURSIVIDAD, ARCHIVOS
1. RECURSIVIDAD
EJEMPLO 1: Contar recursivamente la ocurrencia de un carácter en una cadena.
EJEMPLO 2: Imprimir un arreglo de manera recursiva.
Página 1 de 5
Profesor: Dr. Edgar Ruiz Lizama
EJEMPLO 3: Imprimir un arreglo (en reversa) de manera recursiva.
2. ARCHIVOS
EJEMPLO 4: Dado un intervalo definido por límite inferior y límite superior se pide
encontrar, mostrar y contar las ternas pitagóricas que existen en dicho intervalo.
Una terna pitagórica cumple con la siguiente relación: 𝑎2 + 𝑏2 = 𝑐 2
Página 2 de 5
Profesor: Dr. Edgar Ruiz Lizama
EJEMPLO 5: Igual que en el ejemplo 4, pero esta vez la salida se envía a un archivo
tipo texto.
Página 3 de 5
Profesor: Dr. Edgar Ruiz Lizama
EJEMPLO 6: Abrir y mostrar el contenido del archivo “[Link]” en la pantalla.
Página 4 de 5
Profesor: Dr. Edgar Ruiz Lizama
EJEMPLO 7: Abrir y mostrar el contenido del archivo “[Link]” en la pantalla.
Ejercicios:
1. Escriba un programa que solicite un entero y evalúe la tabla de multiplicar de dicho
número. La salida debe guardarse en un archivo tipo texto.
2. Escriba un programa que solicite dos enteros de un intervalo cerrad; por ejemplo
1 y 12; el programa procede a guardar en un archivo tipo texto las tablas de
multiplicar de los números dentro del intervalo.
3. Escriba un programa que presente en pantalla el contenido del archivo texto
creado en el ejercicio 1.
4. Escriba un programa que presente en pantalla el contenido del archivo texto
creado en el ejercicio 2.
5. Escriba un programa tal que para un determinado numero de estudiantes solicite:
código, nombre y 5 notas enteras. Con estos datos se guarda en cada línea de un
archivo tipo texto: el código, el promedio del alumno y su condición. La condición
puede ser: “APROBADO” O “DESAPROBADO”. Se considera aprobado cuando
el promedio es mayor o igual que 10.5.
Página 5 de 5
Acceso aleatorio en un archivo tipo texto