Professional Documents
Culture Documents
I. Objetivos
Que el estudiante sea capaz de:
Acceder a archivos de texto plano (.txt) con las funciones de la librera fstream.h de C++
Manejar las operaciones bsicas con los flujos entrada (ifstream) y de salida (ofstream) de archivos
Utilizar las funciones de manejo de archivos disponibles en librera fstream.h
Escribir y leer datos de archivos de texto en C++
Utilizar funciones de conversin de tipos de datos proporcionados por librera stdlib.h
II. Introduccin
Archivos y streams
C++ ve a cualquier archivo simplemente como una secuencia de bytes.
Un archivo finaliza ya sea con una marca de end-of-file (eof) o en un byte determinado (tamao del archivo) en
una estructura de datos administrada por el sistema operativo (como un archivo en un directorio).
Cuando un archivo se abre, se instancia un objeto archivo del tipo adecuado y un stream (tambin llamado
nombre de archivo lgico) es asociado con este objeto.
Para realizar estas acciones en C++ deben incluirse los archivos <iostream> y <fstream>
___________________________________________________________________________________________
1
Apertura de archivos
Se define una variable (por ejemplo a r c h i v o ) para administrar el flujo de acceso al archivo (ofstream), por ej.
ofstream archivo;
Luego se invoca al mtodo open con el parmetro apropiado segn la siguiente sintaxis:
archivo.open ("ejemplo.txt", ios::out | ios::app | ios::binary);
Tipo acceso
ios::in
Descripcin
Abrir archivo para lectura
ios::out
ios::ate
ios::app
ios::trunc
ios::binary
Modo binario
___________________________________________________________________________________________
2
Por ejemplo:
ofstream archivo ("ejemplo.bin", ios::out | ios::app | ios::binary);
Funciones de archivos
Archivo.close();
Se encarga de vaciar los buffers que usa el archivo y cerrar acceso al archivo.
Funcin e o f ( )
Para conocer si se ha llegado al final del archivo al leerlo.
Opciones de estado
Permiten conocer el estado de los flujos de datos del contenido de un archivo.
bad(): Retorna true si ocurre una falla en las operaciones de lectura o escritura. Por ejemplo en caso de que
tratemos de escribir en un archivo que no est abierto para escritura.
fail(): Retorna true en los mismos casos que bad() y adems en caso de que ocurra un error de formato, como
tratar de leer un nmero entero y obtener una letra.
eof(): Retorna true si el archivo abierto ha llegado a su fin.
good(): Es el ms genrico. Retorna false en los mismos casos en los que al llamar a las funciones previas se
hubiera obtenido true.
___________________________________________________________________________________________
3
Convierte un valor entero (value) a una cadena caracteres (str), indicando opcionalmente a la base (Base) del
sistema numrico en la que se expresara la respuesta, ej.
int n;
char buffer[33];
cout<<"ingrese un numero entero: "; cin>>n;
itoa (n,buffer,10);
cout<<"decimal es "<<buffer;
itoa (n,buffer,16);
cout<<endl<<"hexadecimal sera "<<buffer;
itoa (n,buffer); //si ignora la base, asume que la misma es base 10
cout<<"decimal es "<<buffer;
___________________________________________________________________________________________
4
Function atoi
int atoi (const char * str);
Function atof ( )
double atof (const char* str);
___________________________________________________________________________________________
5
III. Requerimientos
N
1
2
3
Cantidad
1
1
1
Descripcin
Compilador Dev-C++
Gua de Laboratorio #11 de Introduccin a la Programacin
Memoria USB
IV. Procedimiento
1.
Preparar una carpeta denominada IPguia11proc_CARNET, en el cual guardara cada uno de los cpps del
procedimiento y de los problemas a resolver.
Crear un nuevo archivo de cdigo fuente denominado guia11Ejemplo1 y digite el siguiente cdigo:
#include<iostream>
using namespace std;
//biblioteca de C++ que proporciona funciones y operadores
//para el manejo de archivos
#include<fstream>
#include<stdlib.h>
main(){
ofstream archivo; // crea un objeto de la clase ofstream
char nom[25];//nombre a solicitar a usuario
cout<<"\tDemostracion acceso a un archivo de texto\n";
//Abre el archivo en forma de escritura (ios::out)
archivo.open("agenda.txt",ios::out);
//comprueba si archivo fallo al querer crearlo/abrirlo
if (!archivo){
cout<<"No se puede abrir el archivo" <<endl;
}else{
cout<<"Acceso correcto para escritura del archivo\n";
cout<<"Escriba 1er nombre a registrar en archivo:";
cin.getline(nom,25);
//escribe nombre en nuevo archivo
archivo<< "1er nombre: " << nom <<endl;
cout<<"Ahora escriba 2do nombre:";
cin.getline(nom,25);
//escribe nombre en nuevo archivo
archivo<< "2do nombre: " << nom <<endl;
___________________________________________________________________________________________
6
3.
Ejecute el programa anterior. Observe que la aplicacin le indica que se ha logrado acceso al archivo para
escritura.
Por ser la 1er vez que ejecuta el programa, ofstream crea el archivo agenda.txt.
Minimice la ventana del compilador y observe contenido de su carpeta de trabajo. Se ha creado el archivo
en la misma carpeta donde se ha generado el .exe del cod.fuente de C++ actual.
Ingrese al archivo de texto agenda.txt para confirmar el contenido del archivo y cierre la ventana del editor
de texto
4.
Vuelva a ejecutar el programa y este le solicita nuevamente 2 nombres para escribir en archivo.
Abra nuevamente el archivo agenda.txt y compare su contenido actual con el de la 1er ejecucin.
El contenido es de igual contenido o diferente?
5.
6.
Cerrar ventana del archivo agenda.txt y retornar al editor de C++. Cambia el nombre del archivo
a g e n d a . t x t por el de c : \ a g e n d a . t x t , para intentar crear el archivo de texto en la raz del
sistema de archivos del disco duro.
Ejecutar de nuevo el programa y analice el resultado
7.
Retorne al cod.fuente del programa y restaure el nombre del archivo a crear como a g e n d a . t x t .
Adems, reemplazar el parmetro resaltado i o s : : o u t por el del Modo agregar archivo (i o s : a p p ).
8.
9.
10. Guardar los cambios del archivo cpp actual y hacer una copia del mismo bajo el nombre guia11Ejemplo2.
De este nuevo cpp, borre todo el contenido de la funcin main, excepto la ltima funcin system(pause).
Ahora har las pruebas de acceso a un archivo en modo Lectura, para obtener la informacin almacenada
en un archivo de texto ya existente.
11. Digite el siguiente cdigo entre las llaves { } de main del cpp guia11Ejemplo2:
___________________________________________________________________________________________
7
}//fin if inicial
12. Guardar los cambios y compile el programa. Ante la solicitud del nombre del archivo, digitar miagenda.txt.
El programa indicara que el archivo de no pudo abrir.
13. Repita el paso anterior, pero digite el nombre del archivo de texto ya existente (agenda.txt)
Del resultado devuelto, Qu es lo que realmente esta leyndose del archivo con la lnea de cdigo
resaltada a r c h i v o 2 > > l i n e a t e x t o ?
14. Comente la lnea resaltada del paso anterior e inserte en su lugar este comando:
archivo2.getline(lineatexto,100);
15. Ejecute de nuevo el programa para leer contenido de archivo agenda.txt. Funciono esta vez la lectura de
las lneas del archivo?, Hay algn problema en el resultado visto en pantalla?
___________________________________________________________________________________________
8
int cuenta;
char nombre[15];
char apellido[15];
double saldo;
int n,i;
cout<<"Aplicacion para la creacion de registros bancarios\n\n";
//ofstream abre el archivo en forma de escritura
// ios::app agrega los datos al final del archivo
ofstream archivoclientessalida("cliente.txt", ios::app);
//Finaliza programa si no se puede crear el archivo
if (!archivoclientessalida){
cout<<"No se puede abrir el archivo" <<endl;
exit(1);//Finaliza main, sin ejecutar resto del codigo
}
cout<<endl<<"Digite el numero de clientes a ingresar: ";
cin>>n;
i=1;//inicia con empleado 1
//Lee cuenta, nombre y saldo con cin
while (i<=n) {
cout<<"\n\n--> Datos de Cuenta (#"<<i<<"):\n";
cout<<"\nNumero de cuenta ??\t";cin>>cuenta;
cout<<endl<<"Nombres ??\t";
fflush(stdin); cin.getline(nombre,15);
cout<<endl<<"Apellidos ??\t";
fflush(stdin); cin.getline(apellido,15);
cout<<endl<<"Saldo inicial($) ??\t ";cin>>saldo;
//Escribe variables anteriores en el archivo de salida
archivoclientessalida<<cuenta<<endl<<
nombre<<endl<<apellido<<endl<<saldo<<endl;
i++;//proximo empleado a registrar
} //fin de while i
//cierra acceso archivo de escritura
archivoclientessalida.close();
cout<<"\nSE TERMINO DE AGREGAR DATOS AL ARCHIVO\n";
system("pause");
}//fin main
17. Compilar y ejecutar el programa anterior. Ingresar un total de 2 cuentas bancarias y luego ingresar los
respectivos datos de c/u. Al finalizar el programa, localizar archivo cuentas.txt en la carpeta de trabajo y
revisar su contenido
18. Repetir el paso anterior, pero con datos de nuevas cuentas bancarias. Despus revisar nuevamente el
archivo de texto cuentas.txt y confirmar que la informacin se va acumulando al final.
19. Crear un nuevo archivo cpp, para guardarlo bajo el nombre guia11Ejemplo4. En este ltimo ejemplo, se
recupera la informacin sobre las cuentas bancarias registradas en el archivo de texto cuenta.txt (creadas
con el programa del ejemplo anterior).
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
___________________________________________________________________________________________
9
#include <conio.h>
main(){
//datos de una cuenta ahorro
char linea[10];
int cuenta;
char nombres[25];
char apellidos[25];
double saldo;
// ifstream abre el archivo en modo -lectura
ifstream archivoclientesentrada("cliente.txt",ios::in);
//sale del programa si ifstream no puede abrir el archivo
if (!archivoclientesentrada)
cout<<"no se puede abrir el archivo" <<endl;
else{
cout<<"\tLISTA DE CUENTAS BANCARIAS REGISTRADAS\n\n";
cout.setf(ios::fixed);
cout.precision(2);
//prepara encabezado de tabla a mostrar
cout<<"#Cuenta"<<setw(17)<<"Nombre"<<setw(25)<<
"Apellido"<<setw(16)<<"Saldo($)"<<endl;
//
Lista cada registro en el archivo
//verifica que no ha llegado al final del archivo
while (!archivoclientesentrada.eof()){
/*se captura del archivo los datos, para ser almacenados
en las variables del programa*/
archivoclientesentrada.getline(linea,10);
cuenta=atoi(linea);//convierte cadena texto en valor entero (int)
if(cuenta==0) //ya no hay cuentas que mostrar
break;//finaliza while
archivoclientesentrada.getline(nombres,25);
archivoclientesentrada.getline(apellidos,25);
archivoclientesentrada.getline(linea,9);
saldo=atof(linea);//convierte cadena texto en valor float
//muestra resultados en pantalla
cout<<setw(5)<<cuenta<<setw(25)<<nombres<<setw(25)<<
apellidos<<setw(10)<<saldo<<endl;
}//fin de while
}//fin de if
archivoclientesentrada.close();
cout<<endl;
system("pause");
}//fin main
20. Compilar y ejecutar el programa. Confirmar que los datos mostrados en la consola son los mismos
almacenados en el archivo de texto cliente.txt.
___________________________________________________________________________________________
10
PROBLEMAS A RESOLVER:
Elabore el cdigo fuente de C++ que solucionen a cada uno de los problemas a continuacin:
Problema1.cpp
Crear un programa que pida el salario base de n empleados. Calcule el salario neto de c/empleado, tomando en
cuenta que se le descuenta el 3% de ISSS y $60 por un seguro contra accidentes.
___________________________________________________________________________________________
11