Está en la página 1de 10

UNMSM – FACULTAD DE INGENIERIA INDUSTRIAL

ALGORITMOS Y PROGRAMACIÓN 2015 - 0


PROFESOR: EDGAR RUIZ LIZAMA
SEMANA 6 TEMA: FLUJO DE ARCHIVOS

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 está 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)

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 y métodos
para controlar los flujos de entrada y de salida. Ver la figura siguiente:

Manipuladores de entrada/salida

Las funciones width(), precision(), y fill(), 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 ‘ ‘.

ios

istream ostream

istrstream istream_w ithasign ifstream ostrstream ostream_w ithasign ofstream

iostream

fstream strstream stdiostream

Figura 1: Jerarquía de clases de entrada/salida en C++

Página 1 de 10
Los manipuladores pueden tener argumentos o no tenerlos. Los manipuladores sin argumentos (endl,
flush, etc.) están definidos en <iostream>. Los que tienen argumentos están definidos en <iomanip>.
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()

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 y similares. Al
respecto vea la Figura 2.

#include <fstream.h> Flujo de entrada de datos

int main( )
{

... Flujo de salida de datos

Programa en C++ Unidad de disco

Figura 2: Abstracción de un archivo para C++

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 archivo_in; /* archivo_in es el objeto de flujo de archivo para entrada */


ofstream archivo_out; /* archivo_out 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 realizó con éxito la conexión al archivo y close( ) para cerrar el
archivo entre otras que vera más adelante. Todas estas funciones conectan el nombre externo del archivo
con el nombre interno del archivo. Al respecto pruebe los siguientes programas

Página 2 de 10
Ejemplo 1

/* Programa que solicita las notas de un alumno y calcula su promedio. El


resultado es guardado en un archivo texto.
*/
#include <iostream>
#include <fstream> // para objetos de flujo de archivo
#include <stdlib.h> // para exit()

using namespace std;


int main()
{
ofstream escribe; // Objeto logico para escribir en un archivo
char codigo[9]; // Codigo del alumno
cout<<"Codigo alumno? ";
cin.getline(codigo, 9);
// Asociar el objeto del flujo al archivo fisico
escribe.open("codigo.txt");
// Probar el flujo
if (escribe.fail())
{ cerr << "Error en la apertura del flujo de archivo...!\n";
cin.get();
exit(1);//cierra el programa y devuelve el control al Sistema Operativo
}
// Variables locales
char Curso[80]; // nombre del curso
int ep, ef, prac[4], i;
// Solicitar datos
cout<<"Curso? "; cin.getline(Curso, 80);
cout<<"Examen parcial? "; cin >> ep;
cout<<"Examen final? "; cin >> ef;
cout<<"4 Notas practica? ";
for (i = 0; i< 4; i++)
cin >> prac[i];

// Almacenar en el archivo
escribe << "Codigo: " << codigo << endl;
escribe << "Curso: " << Curso << endl;
escribe << "Examen Parcial: " << ep << endl;
escribe << "Examen Final: " << ef << endl;
escribe << "Practicas: ";
for (i = 0; i< 4; i++)
escribe << prac[i] << " ";
escribe << endl;

// Sacando promedio de practicas


double acum = 0;
for (i = 0; i< 4; i++)
acum += prac[i];
double pp = acum/4;
escribe << "Promedio Final: " <<(ep + ef + pp)/3.0<<endl;
cout << "Los datos se guardaron con exito..." << endl;
escribe.close(); // cerrando el flujo
return 0;
}

Página 3 de 10
Ejemplo 2

Ejecución del programa

Archivo generado tras la ejecución del programa: TablaMult.txt

Página 4 de 10
Objetos fstream
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 vea la tabla 2.

Tabla 2: Indicadores de modo


Indicador de modo Descripción
ios :: in Abrir en modo de entrada de datos (Lectura)
ios :: out Abrir en modo salida de datos (Escritura)
ios :: app Abrir en modo agregar (Escritura/Lectura)
ios :: ate Ir al final de un archivo abierto
ios :: binary Abrir en modo binario
ios :: trunc Elimina el contenido de un archivo si este existe
ios :: nocreate Si el archivo no existe, falló abrirlo
ios :: noreplace Si el archivo existe, fallo para abrir la salida de datos

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.

Ejemplo 3

Página 5 de 10
Ejecución del programa

Archivo resultado de la ejecución: “TablaTrigo.txt”

Página 6 de 10
Ejemplo 4: El siguiente programa abre el archivo del ejemplo anterior ymuestra su contenido en pantalla.

Ejemplo 5: Programa que genera un nuevo archivo de texto, pero esta vez sin encabezado.

Página 7 de 10
El contenido de TablaTrigo2.txt es el siguiente:

Ejemplo 6:
Teniendo el archivo “TablaTrigo2.txt”, el siguiente programa abre dicho archivo para lectura y con esta
información escribe en un nuevo archivo “TablaTrigo3.txt”, los datos del archivo anterior pero añadiendo
una nueva columna de datos que es el valor de la tangente de cada ángulo.

Página 8 de 10
Contenido del nuevo archivo “TablaTrigo3.txt”

Tabla 3 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 introducción de datos con
un ‘\0’.

peek(variable_de_caracter) Devuelve el siguiente carácter en el flujo de insumo


de datos sin extraerlo de ella.

put(expresion_de _caracter) Coloca un carácter en el flujo de salida de datos

putback(expresion_de_carácter) Devuelve un carácter al flujo de insumo de datos.


No altera los datos en el archivo.

eof(void) Devuelve true si se intentó leer por encima de


EOF(End Of File; fin de archivo).

ignore(int n) Brinca los n caracteres siguientes; si se omite la n,


el valor implícito es brincar el siguiente carácter
aislado.

Página 9 de 10
EJERCICIOS
1. Escriba un programa tal que guarde en cada línea del archivo “Notas.txt”, el código, primer apellido,
segundo apellido y las cuatro notas de N alumnos.
2. Escriba un programa que abra el archivo anterior “Notas.txt” y guarde en cada línea del archivo texto
“Acta.txt”, el código, primer apellido, segundo apellido y el promedio del alumno. Las cuatro notas de un
alumno representan examen parcial, examen final, promedio de prácticas y promedio de laboratorio. La
fórmula para calcular el promedio es PF = 0.25EP+0.35EF+0.2PP+0.2PL.
3. Se tiene un archivo de texto llamado marcas1.txt que contiene en cada una de sus líneas la marca de
un auto. Escribir un programa que permita crear otro archivo de texto llamado marcas2.txt de tal forma
que su contenido sea el mismo que el de marcas1.txt pero en orden contrario. En la solución evite el
uso de arreglos de cadenas.
Por ejemplo:
Archivo marcas1.txt Archivo marcas2.txt
Toyota Mitsubishi
Volkswagen BMW
Hyundai Honda
Ford Ford
Honda Hyundai
BMW Volkswagen
Mitsubishi Toyota

4. Respecto al problema 6, escriba un programa que permita crear el archive marcas3.txt, el cual contiene
las marcas del archivo marcas1.txt, pero ordenadas ascendentemente.
5. Se tiene en el archivo texto datosTrab.txt los datos de para la planilla mensual de los trabajadores de la
empresa “Construyendo SAC”. En cada línea del archivo se tiene: código, apellido paterno, apellido
materno, nombre, horas trabajadas y tarifa por hora.
Escribir un programa tal que entre otras funciones tenga las siguientes
a) Función que recibe el archivo de datos y crea un nuevo archivo donde se guardan en cada línea:
código, horas trabajadas, pago antes de descuento y pago después de descuentos; de cada
trabajador. Para el pago se considera un descuento del 8% para la Seguridad Social y 10% para la
AFP.
b) Función que recibe el archivo de datos y procede a crear un nuevo archivo donde se guardan en cada
línea el código y el pago antes de descuentos ordenados de mayor a menor.
6. Escriba un programa que abra un archivo tipo texto; luego lo analice y en otro archivo imprima un
reporte, donde se guarden las estadísticas del primer archivo según lo siguiente:

Caracteres: xx
Alfabeticos: xx
Mayúsculas: xx
Minúsculas: xx
Consonantes: xx
Blancos: xx
Digitos: xx
Vocales: xx
De puntuación: xx
Cinco letras más usadas: ABCDE

Donde XX indica la cantidad de dichos caracteres y ABCDE las cinco letras más usadas en el archivo
analizado.

Referencias
1. Deitel H.M. y Deitel P.J. (2009). "C++ Cómo Programar". México. Prentice-Hall Hispanoamericana., 1320 p.
2. Eckel, Bruce (2000) “Thinking In C++” U.S.A. 2nd. Edition Volume 1. MindView Inc.
3. Joyanes Aguilar Luis (2000). “Programación en C++ Algoritmos, estructuras de datos y objetos” Madrid.
McGraw Hill/Interamericana de España S.A. 710p.
4. Ruiz Lizama, Edgar (2009). "Programación con C++" Lima, Fondo editorial UNMSM 434p.
5. Schildt Herbert (1996). “C++ Para Programadores” Madrid. McGraw Hill/Interamericana de España S.A. 398p.
6. Soustrup, Bjarne (2002). "El Lenguaje de Programación C++ Edición especial". España. Addison Wesley –
PEARSON EDUCACION S.A. 1050 p.

Profesor: EDGAR RUIZ LIZAMA

Página 10 de 10