Você está na página 1de 12

1/12

GUIA DE LABORATORIO N 10
ENTRADA/SALIDA DE ARCHIVOS EN C++
OBJETIVOS
1. Conocer y aplicar las funciones de entrada/salida de archivos en C++
2. Aplicar el acceso secuencial y el acceso directo a los archivos

Entrada/Salida en C++
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 esta
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.

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 precision 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 .
Los manipuladores pueden tener argumentos o no tenerlos. Los manipuladores sin
argumentos (endl, flush, etc.) estn definidos en iostream.h. Los que tienen
argumentos estn 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 Programacin

2/12
Tabla 1: Manipuladores de entrada/salida
Manipulador
Descripcin
Establecer base para enteros
dec, hex, oct
Saltar los blancos iniciales
ws;
Imprimir un \n y vaciar el buffer de salida
endl;
Se vaca el buffer de salida
flush;
Establecer ancho mnimo de campo
setw(int w);
Establecer numero de cifras
setprecision(int p);
Establecer un carcter de relleno
setfill(char c);
Equivalente a setf()
setios(long i)
Equivalente a unsetf()
unsetios(int i)

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.
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 mtodos definidos
en sus respectivas clases. As; se tienen open() para abrir archivo, fail() averiguar
si se realizo con xito la conexin 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>
#include <stdlib.h>
int main()
{
ifstream F1;
//abrir archivo con un nombre externo

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

3/12
F1.open("Prueba.dat");
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";
system("PAUSE");
exit(1);
}
cout<<"El archivo se abrio con exito para lectura\n";
system("PAUSE");
}
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 ejecute New
Source File del menu File en Dev-C++ y digite una lnea 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>
#include <stdlib.h>
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"; system("PAUSE");
exit(1);
}
cout<<"El archivo se abrio con exito para lectura\n";
system("PAUSE");
}
Objetos fstream
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.

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

4/12
Tabla 2: Indicadores de modo
Indicador de modo
Descripcin
Abrir en modo de entrada de datos
ios :: in
Abrir en modo salida de datos
ios :: out
Abrir en modo agregar
ios :: app
Ir al final de un archivo abierto
ios :: ate
Abrir en modo binario
ios :: binary
Elimina el contenido de un archivo si este existe
ios :: trunc
Si el archivo no existe, fall abrirlo
ios :: nocreate
Si el archivo existe, fallo para abrir la salida de datos
ios :: noreplace

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 F1 fue previamente declarado, se
puede usar la siguiente instruccin
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
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.
Ejem 3.
/* permitir que el usuario ingrese nombre de archivo que desea abrir y luego
escribir en el archivo */
#include <fstream>
#include <stdlib.h>
#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"; system("PAUSE");
exit(1);
}

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

5/12
//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
<<"Pantalones "<<84.99<<endl
<<"Medias "<<16.99;
//cerrar archivo
Fich.close();
cout<<"Los datos se guardaron con exito en el archivo: "<<Fich<<endl;;
system("PAUSE");
}
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 <stdlib.h>
#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";
system("PAUSE");
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;
Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

6/12
}
//cerrar archivo
mFile.close();
cout<<"\nLos datos se leyeron con exito en el archivo: "<<mFile<<endl;
system("PAUSE");
}

Tabla 3 Mtodos de E/S de la clase fstream


Nombre del mtodo
get(variable_de_carcter)
getline(variable_de_cadena, int n, \n)

peek(variable_de_caracter)
put(expresion_de _caracter)
putback(expresion_de_carcter)

eof()

ignore(int n)

Descripcin
Extrae el siguiente carcter en el flujo
de insumo de datos.
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.
Devuelve el siguiente carcter en el flujo
de insumo de datos sin extraerlo de ella.
Coloca un carcter en el flujo de salida
de datos
Devuelve un carcter al flujo de insumo
de datos. No altera los datos en el
archivo.
Devuelve true si se intent leer por
encima de EOF(End Of File; fin de
archivo).
Brinca los siguientes n caracteres; si se
omite la n, el valor implcito es brincar el
siguiente carcter 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);

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

7/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";
system("PAUSE");
exit(1);
}
//empezar en una nueva linea
cout<<endl;
//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;
system("PAUSE");
}
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);
Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

8/12

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


}
//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();
system("pause");
}
Ejem 7.
//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 Apellidos y Nombres
const int T=80;

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

9/12
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())
{
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();
system("pause");
}

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

10/12

ACCESO DIRECTO (ALEATORIO) DE ARCHIVOS


En el acceso aleatorio se puede leer directamente un carcter del archivo sin tener
todos los caracteres almacenados antes que l. Para proporcionar acceso directo
los objetos de la clase ifstream establecen un marcador de posicin de archivo,
que es un entero largo que representa un desplazamiento desde el principio del
archivo y guarda el rastro del sitio donde se debe leer o escribir el siguiente
carcter.

Tabla 4: Funciones del marcador de posicin de archivo


Nombre
Descripcin
seekg(offset, modo) Para archivos de insumo de datos, se mueve a la posicin
del desplazamiento como se indica en el modo.
seekp(offset, modo) Para archivos de salida de datos, se mueve a la posicin
del desplazamiento como se indica en el modo.
tellg(void)
Para archivos de insumo de datos, devuelve el valor actual
del marcador de posicin en el archivo.
tellp(void)
Para archivos de salida de datos, devuelve el valor actual
del marcador de posicin en el archivo.

Ejem 8.
/* Acceso Directo o aleatorio de archivos
Paso de objeto flujo de archivos a funciones */
#include <fstream>
#include <stdlib.h>
const int M = 13; //maximo de caracteres para el nombre
const int L = 80; // linea de texto: 80 caracteres
const int N = 5; // numero de lineas de texto en el archivo
void Grabar(ofstream &); //pasar un objeto de la clase ofstream
//programa principal
int main()
{
char archi1[M]="texto.txt";
ofstream F1;
F1.open(archi1);
//abrir archivo para escritura
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";
Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

11/12
exit(1);
}
Grabar(F1); //llamar a la funcion
system("PAUSE");
}
void Grabar(ofstream& Fs)
{
int cont; // contador de lineas
char linea[L];
cout<<"Introduzca cinco lineas de texto:"<<endl;
for (cont = 0; cont < N; cont++)
{
cin.getline(linea, LARGOLINEA, '\n');
Fs<<linea<<endl;
}
}
Ejem 9.
/* Acceso aleatorio de archivos Paso de objeto flujo de archivos a funciones */
#include <fstream>
#include <stdlib.h>
const int M = 13; //maximo de caracteres para el nombre
const int L = 80; // linea de texto: 80 caracteres
const int N = 5; // numero de lienas de texto en el archivo
void Abrir( ofstream &); //pasar un objeto de la clase ofstream
void Grabar(ofstream &); //pasar un objeto de la clase ofstream
int main()
{
ofstream F1;
Abrir(F1); // abrir archivo
Grabar(F1); // escribir en el archivo
}
void Abrir(ofstream &mFile)
{
char nombre[M];
cout<<"Ingrese nombre de archivo ";
cin.getline(nombre, M,'\n');
mFile.open(nombre); //abrir el archivo
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);
}
}

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

12/12
void Grabar(ofstream &mFile)
{
int cont; // contador de lineas
char linea[L];
cout<<"Introduzca cinco lineas de texto:"<<endl;
for (cont = 0; cont < N; cont++)
{
cin.getline(linea, L, '\n');
mFile<<linea<<endl;
}
}

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 clasificacin, 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 clasificacin, si lo encuentra
mostrar los datos del libro, en caso contrario mostrar el mensaje Libro no
registrado.
3. Se tiene los siguientes campos: nombre, direccin, 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 ultimo almacenara la siguiente informacin:
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.

Profesor: Ing. Felix Huari

Curso: Algoritmos y Programacin

Você também pode gostar