You are on page 1of 11

UNMSM FACULTAD DE INGENIERIA INDUSTRIAL

ALGORITMOS Y PROGRAMACIN 2015 - 0


PROFESOR: EDGAR RUIZ LIZAMA
SEMANA 6
TEMA: FLUJO DE ARCHIVOS
Uno de los conceptos bsicos de C++ es el de stream o flujo, el cual puede definirse como un dispositivo
que produce o consume informacin. Un flujo est ligado a un dispositivo fsico (memoria, disco, monitor,
etc.).
Cada vez que se ejecuta un programa C++ se abren automticamente tres flujos:
cin : entrada estndar (teclado)
cout: salida estndar (pantalla)
cerr: salida de mensajes de error (pantalla)
C++ dispone de dos jerarquas 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 mtodos
para controlar los flujos de entrada y de salida. Ver la figura siguiente:
Manipuladores de entrada/salida
Las funciones width(), precision(), y fill(), estn declaradas en ios y definidas en las clases istream,
ostream e iostream.
La funcin miembro width() establece el ancho de salida de un dato. Cuando es necesario el sistema la
aumenta de modo automtico.
La funcin miembro precision() establece el nmero de cifras para un dato de salida. Cuando no se indica
la precisin por default es 6 dgitos.
La funcin miembro fill() establece el carcter de relleno para un dato de salida. Por default el caracter de
relleno es un blanco .
ios

is tream

is trstr eam

ostr eam

is tream _w ithasign

if stream

ostrstr eam

ostr eam _w ithasign

io stream

fstr eam

str stream

stdiostr eam

Figura 1: Jerarqua de clases de entrada/salida en C++

Pgina 1 de 11

ofstr eam

Los manipuladores pueden tener argumentos o no tenerlos. Los manipuladores sin argumentos (endl,
flush, etc.) estn definidos en <iostream>.
Los que tienen argumentos estn 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
Descripcin
dec, hex, oct
Establecer base para enteros
ws;
Saltar los blancos iniciales
endl;
Imprimir un \n y vaciar el buffer de salida
flush;
Se vaca el buffer de salida
setw(int w);
Establecer ancho mnimo de campo
setprecision(int p);
Establecer nmero de cifras
setfill(char c);
Establecer un carcter 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 fsicamente 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.
Flujo de entrada de datos

#include <fstream.h>
int main( )
{
...

Flujo de salida de datos

Programa en C++

Unidad de disco

Figura 2: Abstraccin 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

Pgina 2 de 11

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 mtodos definidos en sus respectivas clases. As; se tienen open( )
para abrir archivo, fail( ) averiguar si se realiz con xito la conexin al archivo y close( ) para cerrar el
archivo entre otras que vera ms adelante. Todas estas funciones conectan el nombre externo del archivo
con el nombre interno del archivo. Al respecto pruebe los siguientes programas
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];

Pgina 3 de 11

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;

Pgina 4 de 11

Ejemplo 2

Ejecucin del programa

Archivo generado tras la ejecucin del programa: TablaMult.txt

Objetos fstream

Pgina 5 de 11

Cuando se utiliza la funcin miembro de la clase fstream, como por ejemplo la funcin 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
Descripcin
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 estndar 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 instruccin
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 haran esos
manipuladores en cout. Al respecto se tienen
ios::fixed; ocasiona que el flujo extraiga todos los datos numricos en notacin 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 despus del punto decimal.
Ejemplo 3

Pgina 6 de 11

Ejecucin del programa

Archivo resultado de la ejecucin: TablaTrigo.txt

Pgina 7 de 11

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.

Pgina 8 de 11

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
informacin escribe en un nuevo archivo TablaTrigo3.txt, los datos del archivo anterior pero aadiendo
una nueva columna de datos que es el valor de la tangente de cada ngulo.

Pgina 9 de 11

Contenido del nuevo archivo TablaTrigo3.txt

Tabla 3 Mtodos de E/S de la clase fstream


Nombre del mtodo
get(variable_de_carcter)

Descripcin
Extrae el siguiente carcter 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 lnea (termina la introduccin de datos con
un \0.

peek(variable_de_caracter)

Devuelve el siguiente carcter en el flujo de insumo


de datos sin extraerlo de ella.

put(expresion_de _caracter)

Coloca un carcter en el flujo de salida de datos

putback(expresion_de_carcter)

Devuelve un carcter 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 implcito es brincar el siguiente carcter
aislado.

Pgina 10 de 11

EJERCICIOS
1. Escriba un programa tal que guarde en cada lnea del archivo Notas.txt, el cdigo, 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 lnea del archivo texto
Acta.txt, el cdigo, primer apellido, segundo apellido y el promedio del alumno. Las cuatro notas de un
alumno representan examen parcial, examen final, promedio de prcticas y promedio de laboratorio. La
frmula 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 lneas 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 solucin 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 lnea del archivo se tiene: cdigo, apellido paterno, apellido
materno, nombre, horas trabajadas y tarifa por hora.
Escribir un programa tal que entre otras funciones tenga las siguientes
) Funcin que recibe el archivo de datos y crea un nuevo archivo donde se guardan en cada lnea:
cdigo, horas trabajadas, pago antes de descuento y pago despus de descuentos; de cada
trabajador. Para el pago se considera un descuento del 8% para la Seguridad Social y 10% para la
AFP.
b) Funcin que recibe el archivo de datos y procede a crear un nuevo archivo donde se guardan en cada
lnea el cdigo 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 estadsticas del primer archivo segn lo siguiente:
Caracteres: xx
Alfabeticos: xx
Maysculas: xx
Minsculas: xx
Consonantes: xx
Blancos: xx
Digitos: xx
Vocales: xx
De puntuacin: xx
Cinco letras ms usadas: ABCDE
Donde XX indica la cantidad de dichos caracteres y ABCDE las cinco letras ms usadas en el archivo
analizado.
Referencias
1.
Deitel H.M. y Deitel P.J. (2009). "C++ Cmo Programar". Mxico. 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). Programacin en C++ Algoritmos, estructuras de datos y objetos Madrid.
McGraw Hill/Interamericana de Espaa S.A. 710p.
4.
Ruiz Lizama, Edgar (2009). "Programacin con C++" Lima, Fondo editorial UNMSM 434p.
5.
Schildt Herbert (1996). C++ Para Programadores Madrid. McGraw Hill/Interamericana de Espaa S.A. 398p.
6. Soustrup, Bjarne (2002). "El Lenguaje de Programacin C++ Edicin especial". Espaa. Addison Wesley
PEARSON EDUCACION S.A. 1050 p.
Profesor: EDGAR RUIZ LIZAMA

Pgina 11 de 11