You are on page 1of 12

1/12

GUIA DE LABORATORIO Nº 09
ENTRADA/SALIDA DE ARCHIVOS EN C++

OBJETIVO
Conocer y aplicar las funciones de entrada/salida de archivos en C++, aplicar el
acceso secuencial a los archivos.

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)
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.

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 precision 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 ‘ ‘.
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.

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


2/12

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 numero 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.

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 vera mas adelante. Todas estas funciones conectan el nombre externo
del archivo con el nombre interno del archivo. Al respecto pruebe los siguientes
programas

Ejem 1.
#include <fstream>
int main()
{
ifstream F1;
//abrir archivo con un nombre externo
F1.open("Prueba.dat");

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


3/12

if (F1.fail()) //verificar si se abrio con exito


{
cout<<"El archivo no se puede abrir con exito\n"
<<" verifique si el archivo en realidad existe\n";
exit(1); // Abandona la ejecucion del programa
}
cout<<"El archivo se abrio con exito para lectura\n";
}

Al ejecutar este programa encontrara que falla la apertura del archivo pues este,
no existe. Ahora proceda a crear el archivo Prueba.dat, para ello abra el notepad y
digite una línea de texto cualquiera, finalmente grabe dicho archivo con el nombre
prueba.dat.
Ejecute nuevamente el programa (1) y observará que el archivo se abrió con éxito
para lectura.

Ejem 2.
//permitir que el usuario ingrese nombre de archivo que desea abrir
#include <fstream>
const int M = 13; //maximo de caracteres para el nombre
int main()
{
char F1[M];
ifstream Arch;
//ingresar nombre de archivo
cout<<"Ingrese nombre del archivo que desea abrir: ";
cin>>F1;
Arch.open(F1);
if (Arch.fail()) //verificar si se abrio con exito
{ cout<<"El archivo no se puede abrir con exito\n"
<<" verifique si el archivo en realidad existe\n";
exit(1);
}
cout<<"El archivo se abrio con exito para lectura\n";
}

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.

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


4/12

Tabla 2: Indicadores de modo


Indicador de modo Descripción
ios :: in Abrir en modo de entrada de datos
ios :: out Abrir en modo salida de datos
ios :: app Abrir en modo agregar
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 F1 fue previamente declarado, se
puede usar la siguiente instrucción

F1<<setiosflags(ios::fixed) <<setiosflags(ios::showpoint)<<setprecision(2);

dará formato a todos los datos insertados en el flujo F1 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.

Ejem 3.
/* permitir que el usuario ingrese nombre de archivo que desea abrir y luego
escribir en el archivo */
#include <fstream>
#include <iomanip.h>
const int M = 13; //maximo de caracteres para el nombre
int main()
{ char F1[M]="Datos.dat";
ofstream Fich;
//abrir archivo para escritura
Fich.open(F1);
if (Fich.fail()) //verificar si se abrio con exito
{ cout<<"El archivo "<<F1<<" no se puede abrir con exito\n"
<<" verifique si el archivo en realidad existe\n";
exit(1);
}
//establecer los formatos del flujo de archivo de salida de datos
Fich<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2);
//enviar datos al archivo
Fich<<"Camisas "<<79.99<<endl

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


5/12

<<"Pantalones "<<84.99<<endl
<<"Medias "<<16.99;
//cerrar archivo
Fich.close();
cout<<"Los datos se guardaron con exito en el archivo: "<<Fich<<endl;
}

Para comprobar que la escritura de datos se realizo con éxito pruebe ahora a abrir
el archivo datos.dat.

Ejem 4.
/* Abrir un archivo para escritura y luego leer y desplegar los datos contenidos en
el */
#include <fstream>
#include <iomanip.h>
const int M = 13; //maximo de caracteres para el nombre
const int N = 15; //largo maximo de su descripcion
int main()
{
char Archi[M]="datos.dat";
char descrip[N];
int ch;
float precio;
ifstream mFile;
//abrir archivo para lectura
mFile.open(Archi);
if (mFile.fail()) //verificar si se abrio con exito
{ cout<<"El archivo no se puede abrir con exito\n"
<<" verifique si el archivo en realidad existe\n";
exit(1);
}
//establecer los formatos del flujo de archivo de salida de datos
cout<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2);
//empezar en una nueva linea
cout<<endl;
//leer y desplegar el contenido del archivo
// verificar el siguiente caracter
while ((ch = mFile.peek()) != EOF)
{ mFile>>descrip>>precio; //introducir datos al flujo
cout<<descrip<<' '<<precio<<endl;
}
//cerrar archivo
mFile.close();
cout<<"\nLos datos se leyeron con exito en el archivo: "<<mFile<<endl;
}

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


6/12

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() 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.

Ejem 5.
/* Abrir un archivo para escritura y luego copiar texto
linea por linea desplegandolo en la terminal */
#include <fstream>
#include <stdlib.h>
#include <iomanip.h>
const int M= 13; //maximo de caracteres para el nombre
const int N = 80; //largo maximo de una linea de texto
int main()
{
char Arch[M]="datos.dat";
char linea[N];
int ch;
ifstream F1;
//abrir archivo para lectura
F1.open(Arch);
if (F1.fail()) //verificar si se abrio con exito
{ cout<<"El archivo no se puede abrir con exito\n"
<<" verifique si el archivo en realidad existe\n";
exit(1);
}
//empezar en una nueva linea
cout<<endl;

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


7/12

//leer y desplegar el contenido del archivo linea a linea


// verificar el siguiente caracter
while ((ch = F1.peek()) != EOF)
{//introducir datos al flujo
F1.getline(linea, N, '\n');
// a la salida estandar
cout<<linea<<endl;
}
//cerrar archivo
F1.close();
cout<<"\nLos datos se leyeron con exito en el archivo: "<<archi1<<endl;
}

Ejem 6.
//Programa que almacena los datos de N alumnos y luego lo muestra
#include <iostream.h>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const int M=15;
const int N=25; // Longitud maximo para la descripcion de los Apellidos y Nombres
int main()
{
char mFile[M]="Notas.dat";
char cod[8],ApePat[N],ApeMat[N],Nom[N],obs[11];
float n1,n2,n3,prom;
ifstream F2; // Crea el objeto Archi para Lectura
ofstream F1; // Crea el objeto Archi para Escritura
F1.open(mFile); // Abre un archivo con un nombre externo
if(F1.fail())
{
cout<<"El Archivo no se puede abrir con exito\n"
<<"Verifique si el archivo existe"<<endl;
exit(1);
}
cout<<"El archivo se abrio con exito para Escritura\n";
cout<<"Codigo o Enter para finalizar..... ";gets(cod);

for(;strlen(cod)!=0;)
{
cout<<"Apellido Paterno:";gets(ApePat);
cout<<"Apellido Materno:";gets(ApeMat);
cout<<"Nombres :";gets(Nom);
cout<<"Nota 1 :";cin>>n1;
cout<<"Nota 2 :";cin>>n2;

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


8/12

cout<<"Nota 3 :";cin>>n3;
prom=(n1+n2+n3)/3;
if(prom>10.5)
strcpy(obs,"Aprobado");
else
strcpy(obs,"Desaprobado");
F1<<cod<<" "<<ApePat<<" "<<ApeMat<<" "<<Nom<<" "<<n1<<" "<<n2<<" "
<<n3<<" "<<prom<<" "<<obs<<endl;
cout<<"Codigo o Enter para finalizar..... ";gets(cod);
}

//Cerrando el archivo
F1.close();
F2.open(mFile);
cout<<"Codigo\tApellidos y Nombres\tEvaluaciones\tPromedio\tObserv.\n";
F2>>cod; // Lectura adelantada
while(!F2.eof())
{
F2>>ApePat>>ApeMat>>Nom>>n1>>n2>>n3>>prom>>obs;
cout<<cod<<"\t"<<ApePat<<"\t"<<ApeMat<<"\t"<<Nom<<"\t"<<n1<<"\t"
<<n2<<"\t"<<n3<<"\t"<<prom<<"\t"<<obs<<endl;
F2>>cod;
}
//Cerrando el archivo
F2.close();
}

Ejem 7.
//Programa que almacena los datos de N alumnos y luego lo muestra
#include <iostream.h>
#include <fstream>
#include <stdio.h>
#include <string.h>
const int M=15;
const int N=25; // Longitud maximo para la descripcion de Apellidos y Nombres
const int T=80;
int main()
{
char mFile[M]="Notas.txt";
char cod[8],ApePat[N],ApeMat[N],Nom[N],obs[11];
char registro[T];
float n1,n2,n3,prom;
ifstream F2; // Crea el objeto Archi para Lectura
ofstream F1; // Crea el objeto Archi para Escritura
F1.open(mFile); // Abre un archivo con un nombre externo
if(F1.fail())
{

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


9/12

cout<<"El Archivo no se puede abrir con exito\n"


<<"Verifique si el archivo existe"<<endl;
exit(1);
}
cout<<"El archivo se abrio con exito para Escritura\n";

cout<<"Codigo o Enter para finalizar..... ";gets(cod);


for(;strlen(cod)!=0;)
{
cout<<"Apellido Paterno:";gets(ApePat);
cout<<"Apellido Materno:";gets(ApeMat);
cout<<"Nombres :";gets(Nom);
cout<<"Nota 1 :";cin>>n1;
cout<<"Nota 2 :";cin>>n2;
cout<<"Nota 3 :";cin>>n3;
prom=(n1+n2+n3)/3;
if(prom>10.5)
strcpy(obs,"Aprobado");
else
strcpy(obs,"Desaprobado");
F1<<cod<<" "<<ApePat<<" "<<ApeMat<<" "<<Nom<<" "<<n1<<" "<<n2<<" "
<<n3<<" "<<prom<<" "<<obs<<endl;
cout<<"Codigo o Enter para finalizar..... ";gets(cod);
}

F1.close();//Cerrando el archivo
F2.open(mFile);
cout<<"Codigo\tApellidos y Nombres\tEvaluaciones\tPromedio\tObserv.\n";
while(F2.peek()!=EOF)
{ F2.getline(registro,T,'\n');
cout<<registro<<endl;
}
//Cerrando el archivo
F2.close();
}

Ejem 8.
#include <iostream>
#include <fstream>
using namespace std;
void LeerGrabar(ofstream &f1)
{ int n,i,x,y;
char c[254];
cout<<"Cantidad de puntos a procesar:";cin>>n;
f1.open("puntos.txt");
for(i=0;i<n;i++)
{ cout<<"Procesando el punto #"<<i+1<<endl;

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


10/12

cout<<"Ingrese punto:";cin>>x>>y;
f1<<x<<" "<<y<<endl;
}
f1.close();
cout<<endl; system("cls");
}

void VerPuntos(ifstream &f2)


{ int x,y;
f2.open("puntos.txt");
cout<<"Contenido del archivos Puntos.txt"<<endl;
cout<<"---------------------------------"<<endl;
f2>>x;
for(;!f2.eof();)
{ f2>>y;
cout<<"\t("<<x<<","<<y<<")"<<endl;
f2>>x;
}
f2.close();cout<<endl;
}

void CalculoUbicacion(ofstream &f3,ifstream &f4,int r)


{ int x,y,d;
char obs[20];
f3.open("resumen.txt");
f4.open("puntos.txt");
f4>>x;
while(!f4.eof())
{ f4>>y;
d=x*x+y*y;
if(d<r*r)
strcpy(obs,"este punto esta dentro del circulo");
else if(d>r*r)
strcpy(obs,"este punto esta fuera del circulo");
else
strcpy(obs,"este punto esta en la circunferencia");
f3<<"("<<x<<","<<y<<")\t"<<obs<<endl;
f4>>x;
}
f3.close();f4.close();
}

void VerEstadistica(ifstream &f6)


{ char c[254];
f6.open("resumen.txt");
cout<<"Contenido del archivo Resumen.txt"<<endl;
cout<<"----------------------------------------------"<<endl;

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


11/12

for(;!f6.eof();)
{ f6.getline(c,80);
cout<<c<<endl;
}
f6.close();
}

int LeeRadio()
{ int r1;
cout<<"\nIngrese radio de circulo con centro en origen de coordenadas:";
cin>>r1;
cout<<endl;
return r1;
}

int main()
{ int radio;
ofstream file1,file3;
ifstream file2,file4,file6;
LeerGrabar(file1);
VerPuntos(file2);
radio=LeeRadio();
CalculoUbicacion(file3,file4,radio);
VerEstadistica(file6);
cout<<endl;
}

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación


12/12

PROBLEMAS PROPUESTOS
1. Escribir un programa que permita crear un archivo de inventario de los
libros de la biblioteca de la facultad, para luego calcular el monto total del
inventario valorizado y mostrar el contenido del archivo. Los datos por cada
libro que se almacena son el titulo, autor, nro clasificación, precio y
cantidad. Asumir que se tiene N libros

2. En base al problema anterior ampliar el mismo de tal manera que nos


permita realizar una consulta por el numero de clasificación, si lo encuentra
mostrar los datos del libro, en caso contrario mostrar el mensaje “Libro no
registrado”.

3. Se tiene los siguientes campos: nombre, dirección, fecha de nacimiento,


genero, estado civil, los cuales se almacenara en un archivo llamado
Maestro.Dat, Luego se pide abrir este de tal manera que se genere otro
archivo llamado Tauro.Dat, este último almacenara la siguiente información:
Nombre, fecha de nacimiento, de todos los registros del archivo maestro,
siempre que el mes de nacimiento sea mayo. Finalmente mostrar el listado
de los dos archivo generados.

4. Se tiene un archivo que llamado Sales.txt donde se va almacenar el registro


de ventas para N clientes, por cada cliente se procesa los siguientes datos:
número de ruc, razón social, monto de ventas condición de ventas(0:
contado, 7: 7 días crédito, 15: 15 días de crédito, 30: 30 días de crédito, 45:
45 días de crédito y 60: 60 días de crédito. En base a ello se pide escribir
un programa para realizar lo siguiente:

a) Lectura de datos y guardar en el archivo.


b) Mostrar el contenido del archivo Sales.txt y mostrar el total de ventas
realizadas, el promedio de ventas.
c) Generar un archivo en función a la condición de pago que se desea, donde
el archivo tendrá el siguiente nombre Pagoxx.txt, donde xx se refiere a la
condición de pago.
d) Listar el contenido del archivo generado en la pregunta c) e indicar a cuánto
asciende el total de ventas.
e) Generar 2 archivos que se llamen Juridica.txt y Natural.txt. En el archivo
Juridica.txt se filtrara todos los datos del archivo Sales.txt cuyo número de
ruc comience con 20, en otro caso será los que son personas naturales y se
almacenara en Natural.txt
f) Listar el contenido de los 2 archivos generados.

Profesor: Ing. Felix Huari Curso: Algoritmos y Programación

You might also like