Lab5 IntroALaPrograC2 2018
Lab5 IntroALaPrograC2 2018
OBJETIVOS
Introducción.
La E/S en C++ ocurre en forma de flujos de bytes. El proceso de entrada obtiene los datos de algún medio
externo (por ejemplo, del teclado o de un archivo en disco) y los envía a la memoria de la computadora para
que sean procesados por algún programa. Cuando se introduce un dato, este es almacenado en una variable
en memoria. Esto quiere decir que habrá que utilizar variables en cualquier proceso de un programa.
Página 1 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
La operación de salida envía una copia de los datos que hay en la memoria de la computadora a otro lugar, por
ejemplo, los visualiza en el monitor, los escribe por la impresora o los guarda en un archivo o en un disco. La
operación de salida no borra los datos de la memoria ni cambia la forma en que están almacenados,
simplemente hace una copia de los mismos para enviarlos a otro lugar.
En este laboratorio centraremos nuestra atención en el manejo de archivos, ya que en nuestras prácticas
anteriores hemos estado utilizado las funciones de la biblioteca de C++ que permiten realizar operaciones de
entrada y de salida sobre los dispositivos estándar de la computadora (cin y cout); esto es, funciones para
introducir datos desde el teclado y funciones para visualizar datos en el monitor. Los capítulos que
abordaremos son el 13 y 14 de nuestro libro de texto. Desarrollaremos una serie de ejemplos que le ayudarán
a comprender la utilidad del manejo de archivos, desde crear, abrir, modificar y mostrar su contenido en
pantalla.
Además, se hablará sobre los tipos de datos de Estructura, cómo se declaran y su gran utilidad combinada con
el manejo de archivos.
Todos los programas realizados hasta el momento obtenían los datos necesarios para su ejecución de la
entrada estándar de la computadora (el teclado) y visualizaban los datos en la salida estándar (el monitor). Por
otra parte, cabe mencionar que los programas retienen los datos que manipula mientras esté en ejecución; es
decir, los datos introducidos se pierden cuando finaliza el programa, esto se debe a que el almacenamiento
de datos en memoria es temporal.
La solución para que los datos persistan de una ejecución a otra, es decir que no se borren cuando finaliza la
ejecución del programa, es almacenarlos en un archivo en el disco duro o en cualquier otro medio de
almacenamiento; de esa manera los datos estarán disponibles cada vez que se ejecute el programa y se
requiera manipularlos.
Desde el punto de vista informático, un archivo es una colección de información que almacenamos en
dispositivos de almacenamiento secundario como discos duros, CD, DVD, memorias USB Flash, etc., para
Página 2 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
después manipularlos. Esta información se almacena como un conjunto de registros (estructuras), conteniendo
todos ellos, generalmente, los mismos campos.
Para dar soporte para el trabajo con archivos, la biblioteca de C++ proporciona varias funciones de
Entrada/salida que permiten leer y escribir datos a y desde archivos y dispositivos.
C++ considera a cada archivo como una secuencia de bytes. Cada archivo termina con un marcador de fin de
archivo. Cuando se abre un archivo, se crea un objeto y se asocia un flujo a ese objeto.
Lo primero que debemos hacer es incluir previamente la biblioteca “fstream” donde están definidos los tipos
de archivos en C++ y las operaciones que se pueden realizar sobre ellos:
#include <fstream.h>
Existen dos tipos de archivos: de entrada (sólo está permitido leer) y de salida (sólo está permitido escribir
datos). Los dos tipos de archivos están identificados en C++ por dos clases diferentes:
Declaración de variables:
Apertura de un archivo
Una vez definida la variable que usaremos para referirnos al archivo con el que vamos a trabajar, y antes de
realizar ninguna otra operación sobre el archivo, lo primero que hay que hacer es abrirlo mediante open:
Página 3 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Todos los archivos de entrada y salida que nuestros programas usan tienen dos nombres: el verdadero nombre
del archivo (nombre físico) que solo se usa en la llamada a la función open, que conecta el archivo a un flujo,
y el nombre del flujo (nombre lógico) al que queda conectado el archivo y es el que usaremos en las
operaciones de lectura/escritura sobre archivos.
Podemos abrir un archivo cuyo nombre está guardado en una variable tipo string. Esta técnica es muy útil
para introducir los nombres de los archivos por teclado.
string nombre;
cin >> nombre;
entrada.open(nombre.c_str());
Una llamada a una función open puede fallar por varias razones: si intentamos abrir un archivo de entrada y
no existe dicho archivo, intentamos abrir un archivo de salida y no tenemos permisos de escritura sobre dicho
archivo. En estos casos es posible que no se despliegue un mensaje de error y que el programa continúe y haga
Página 4 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
algo inesperado. Por ello, es conveniente después de una llamada a open comprobar si el archivo no se ha
abierto correctamente y si es así terminar la ejecución del programa:
entrada.open(“datos.dat”);
if (!entrada)
{
cout << “No se pudo abrir el archivo de entrada\n”;
exit(1);
}
La instrucción exit(1) termina el programa de inmediato. Esta instrucción está definida en la biblioteca stdlib,
por tanto, necesitamos incluir #include <stdlib.h>.
int x;
entrada >> x; //Funciona con tipos de datos que permitan la conversión a
// cadena de caracteres.
entrada.get(c); //Sólo funciona con char
string frase;
getline (entrada, frase); // Sólo funciona con string
int x;
salida << x; //Funciona con tipos de datos que permitan la conversión a
// cadena de caracteres.
salida.put(c); //Sólo funciona con char
Cerrar archivos
Todos los archivos deben cerrarse cuando el programa haya terminado de obtener entradas del archivo o de
enviar salidas al archivo. Al cerrar un archivo desconectamos su flujo. Los archivos se cierran con la instrucción
close. Observar que la función close no toma argumentos.
Página 5 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
entrada.close( );
salida.close( );
La función eof()
entrada.eof( );
Esta función nos devuelve una expresión booleana: true si hemos llegado al final del archivo y ya no hay más
información para leer, y false en caso contrario.
while (! entrada.eof( ))
{
cout << siguiente;
entrada.get(siguiente);
}
Página 6 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Ejemplo 1 (Creación de un archivo). En este primer ejemplo, veremos de una manera sencilla y a
grandes rasgos la forma en cómo se crea, abre, edita y cierra un archivo, además de como extraer la
información contenida para ser mostrada en la pantalla. Su tutor le guiará para que desarrolle cada una de
estas actividades por pasos, es decir, primero escriba las líneas de código necesarias para crear el archivo,
luego, verifique que se haya creado el archivo, escriba una línea de texto en él, por último, ábralo y muestre
en pantalla su contenido.
#include <iostream>
#include <fstream> //incluimos la librería para el manejo de archivos
using namespace std;
int main() {
char cadena[40];
ofstream fs("prueba.txt"); // Creamos un fichero de salida
return 0;
}
Salida:
En el ejemplo anterior se crea un archivo llamado “prueba.txt”, luego introducimos una línea de texto en él y
por último lo abriremos para mostrar en pantalla su contenido.
Los ejemplos posteriores explican con mayor detalle cada una de estas etapas de la manipulación de
archivos.
Página 7 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
int main()
{
Salida:
Página 8 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
int main()
{
char buffer[256];
// Abre un archivo en forma de lectura
ifstream Ejemplo2("Ejemplo2.txt");
// Verifica que el archivo no tenga problemas de lectura
if(!Ejemplo2.is_open())
{
cout<<"Error al abrir el archivo";
exit(1);
}
// Evalúa si no ha llegado al final del archivo
while(!Ejemplo2.eof())
{
// Copia en la variable buffer una línea del archivo
Ejemplo2.getline(buffer,100);
cout<<buffer<<endl;
}
system("pause");
return 0;
}
Salida:
Página 9 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Estructuras.
Una estructura o registro es un tipo de dato estructurado que agrupa una o más variables, de un mismo o de
diferente tipo de datos que a su vez estos pueden ser datos simples o datos estructurados. Una estructura se
declara de la siguiente manera:
};
Puede observarse que dentro de las llaves se declaran los campos que conforman la estructura con su
respectivo tipo de dato. Por ejemplo:
struct persona
{
char nombre[20];
char apellido[20];
float nota1;
float nota2;
float nota3;
float promedio;
};
Para declarar una variable del tipo persona, se procede de la siguiente manera:
persona estudiante;
Aprovecharemos los ejemplos posteriores para ilustrar por completo la utilidad de las estructuras, note la
forma de pasar datos a cada uno de los campos de la estructura utilizando el operador “.”.
Página 10 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
#include<iostream>
#include <iomanip>
#include<stdlib.h>
persona estudiante;
int main()
{
cout<<"\nIngrese el nombre del estudiante: ";
cin>>estudiante.nombre;
cout<<"\nnIngrese el apellido del estudiante: ";
cin>>estudiante.apellido;
cout<<"\nIngrese la Nota 1: ";
cin>>estudiante.nota1;
cout<<"\nIngrese la Nota 2: ";
cin>>estudiante.nota2;
cout<<"\nIngrese la Nota 3: ";
cin>>estudiante.nota3;
estudiante.promedio=(estudiante.nota1+estudiante.nota2+estudiante.nota3)/3;
cout<<"\n------Impresion de datos------";
cout<<"\nNombre: "<<estudiante.nombre;
cout<<"\nApellido: "<<estudiante.apellido;
cout<<"\nNota 1: "<<estudiante.nota1;
cout<<"\nNota 2: "<<estudiante.nota2;
cout<<"\nNota 3: "<<estudiante.nota3;
//set precision incluye la parte entera
//3 dira un entero 2 decimales.
cout<<setprecision(3)<<"\nPromedio: "<<estudiante.promedio;
Página 11 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
if(estudiante.promedio>=6)
cout<<endl<<"---Aprobado---";
else
cout<<endl<<"---Reprobado---";
cout<<endl;
system("pause");
return 0;
}
Salida:
Página 12 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Ejemplo 5: envío de una estructura a una función con paso por valor
Realice la modificación del código del ejemplo anterior para que permita el envío de una estructura a una
función con paso por valor; y que dicho contenido de la estructura sea mostrado en pantalla al usuario e
indique si aprobó o reprobó.
#include<iostream>
#include<iomanip>
#include<stdlib.h>
int main()
{
persona estudiante;
cout<<"\nIngrese el nombre del estudiante: ";
cin>>estudiante.nombre;
cout<<"\nIngrese el apellido del estudiante: ";
cin>>estudiante.apellido;
cout<<"\nIngrese la Nota 1: ";
cin>>estudiante.nota1;
cout<<"\nIngrese la Nota 2: ";
cin>>estudiante.nota2;
cout<<"\nIngrese la Nota 3: ";
cin>>estudiante.nota3;
//unicamente enviamos la estructura a la funcion
imprimirdatos(estudiante);
system("pause");
}
Página 13 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
{
dato.promedio=( dato.nota1+ dato.nota2+ dato.nota3)/3;
cout<<"\n------Impresion de datos------";
cout<<"\nNombre: "<< dato.nombre;
cout<<"\nApellido: "<< dato.apellido;
cout<<"\nNota 1: "<< dato.nota1;
cout<<"\nNota 2: "<< dato.nota2;
cout<<"\nNota 3: "<< dato.nota3;
//set precision incluye la parte entera
//3 dira un entero 2 decimales.
cout<<setprecision(3)<<"\nPromedio: "<< dato.promedio;
if(dato.promedio>=6)
cout<<endl<<"---Aprobado---";
else
cout<<endl<<"---Reprobado---";
cout<<endl;
}
Salida:
Página 14 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
#include <iostream>
#include<iostream>
#include<stdlib.h>
struct Persona
{
int Codigo;
char Nombre[30];
char Carrera[40];
};
//se pueden declarar variables de tipo Persona
//Persona Estudiante, Maestro;
//a la vez podemos tener arreglos del tipo Persona
Persona Grupo[3];
int main()
{
int opc=0,i=0,j;
do
{
cout<<"\t *******DATOS DE PERSONAS********"<<endl;
cout<<"\n \t 1.Agregar Estudiantes"<<endl;
cout<<"\n \t 2.Mostrar Estudiantes"<<endl;
cout<<"\n \t 3.Salir"<<endl;
cout<<"\n \n Ingrese una de las tres opciones disponibles: ";
cin>>opc;
switch(opc)
{
case 1:
if(i==3)
{
cout<<"\nERROR SOLO SE PUEDEN CREAR 3 ESTUDIANTES \n";
break;
}
cout<<"\ncorrelativo #: "<<i+1<<endl;
cout<<"\n Codigo: (numeros)---:";
cin>>Grupo[i].Codigo;
Página 15 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
break;
case 3:cout<<"El programa finalizara \n ";
break;
default:
cout<<"\n La opcion no esta definida, intente nuevamente\n";
break;
}//fin de switch
system("pause");
system("cls");
}while(opc!=3);//mantiene el lazo
return 0;
}
Página 16 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Realice un programa que permita llevar el registro de clientes de la empresa Money. Para ello se necesita que
cada vez que sea ejecutado el programa consulte al usuario cuántos nuevos registros se almacenarán en un
archivo llamado “cliente.txt”, los nuevos registros que se vayan almacenando, deberán de insertarse al final
de dicho archivo.
Los datos que se deben de registrar de cada uno de los clientes son: Cuenta, Nombre, Apellido y Saldo.
#include <iostream>
#include <fstream>
main()
{
int cuenta;
char nombre[15];
char apellido[15];
double saldo;
int n,i;
//ofstream abre el archivo en forma de escritura
// ios::app agrega los datos al final del archivo
ofstream archivoclientessalida("cliente.txt", ios::app);
//salir del programa si no se puede crear el archivo
if (!archivoclientessalida)
{
cout<<"No se puede abrir el archivo" <<endl;
exit(1);
}
cout<<endl<<"Digite el numero de clientes a ingresar: ";
cin>>n;
i=1;
//Leer cuenta, nombre y saldo, despues colocarlos en el archivo
while (i<=n)
{
archivoclientessalida<<endl;
cout<<endl;
cout<<endl<<"Digite Numero de cuenta: ";
cin>>cuenta;
cout<<endl<<"Digite Nombre: ";
cin>>nombre;
cout<<endl<<"Digite Apellido: ";
cin>>apellido;
cout<<endl<<"Digite Saldo: ";
cin>>saldo;
archivoclientessalida<<cuenta<<' '<<nombre<<' '<<apellido<<' '<<saldo;
Página 17 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
i++;
system("cls"); //limpia la pantalla
} //fin de while
archivoclientessalida.close();
cout<<"\nSE TERMINO DE AGREGAR DATOS AL ARCHIVO";
cout<<endl;
system("pause");
}
Salida:
#include <iostream>
#include <fstream>
#include <iomanip>
#include<stdlib.h>
main()
{
int cuenta;
char nombre[15];
char apellido[15];
double saldo;
// ifstream abre el archivo en forma de lectura
ifstream archivoclientesentrada("cliente.txt",ios::in);
//salir del programa si ifstream no puede abrir el archivo
if (!archivoclientesentrada)
{
cout<<"No se puede abrir el archivo" <<endl;
}
else
{
Página 18 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Página 19 de 20
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA
CÁTEDRA DE INFORMÁTICA
Ejercicios propuestos:
Desarrolle correctamente los ejercicios que se plantean a continuación. Recuerde que el objetivo es poner en
práctica lo visto en este laboratorio y que usted aprenda a programar; en ese sentido, le sugerimos que se
esmere en resolverlos por cuenta propia y le haga saber a su tutor cualquier inquietud que se presente. Buena
suerte!!!
Ejercicio #1: Realice un programa que, basado en lo realizado en los ejemplos 7 y 8 de este laboratorio, permita
al usuario poder agregar y mostrar la lista de clientes de determinada empresa. Tome en cuenta los siguientes
lineamientos:
1. Mostrar al usuario el menú: Agregar clientes, Mostrar clientes y Salir. Debe permitir la capacidad de
volver al menú principal después de realizada una inserción de datos o una consulta de los mismos.
2. Crear una estructura llamada Cliente con los campos Numero de cuenta, nombre, apellido y saldo.
3. Crear un arreglo de tipo Cliente (la estructura creada en el paso anterior) para almacenar los datos
que el usuario vaya ingresando (recuerde que el contenido de las variables solo está disponible durante
la ejecución del programa).
4. Se debe crear un archivo llamado “Clientes.txt” para almacenar los datos de los clientes ingresados
(recuerde que un archivo sirve para almacenar información y está disponible después de finalizado el
programa).
Nota: El documento a subir será una carpeta con su número de carné, en dicha carpeta colocará todos los
códigos de los ejercicios y el documento del reporte en Word, a continuación, comprima la carpeta en zip y
súbala al link correspondiente en la plataforma virtual. Por favor lea la rúbrica completa para saber que debe
llevar el documento del reporte.
Página 20 de 20