Guiacpp 09
Guiacpp 09
Guiacpp 09
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++
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.
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");
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.
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
<<"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;
}
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;
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;
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())
{
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;
cout<<"Ingrese punto:";cin>>x>>y;
f1<<x<<" "<<y<<endl;
}
f1.close();
cout<<endl; system("cls");
}
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;
}
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