Está en la página 1de 10

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA


CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

PRCTICA: MANEJO DE ARCHIVOS


I. OBJETIVOS

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. FUNDAMENTO TERICO

ARCHIVOS Y STREAMS

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>

APERTURA DE ARCHIVOS

Se define una variable (por ejemplo archivo) para administrar el flujo de acceso al archivo
(ofstream) por ejemplo:

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 DESCRIPCIN


ios::in Abrir archivo para lectura
ios::out Abrir archivo para escritura
ios::ate Posicin inicial: fin del archivo
ios::app Cada salida se agrega al final del archivo
ios::trunc Si el archivo ya existe se borra su contenido
ios::binary Modo binario

Por ejemplo:

ofstream archivo(ejemplo.bin,ios::out|ios::app|ios::binary);

FUNCIONES DE ARCHIVOS

archivo.close(): Se encarga de vaciar los buffer que usa el archivo y cerrar el acceso al
archivo

1 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

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

o 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.
o 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.
o eof(): Retorna true si el archivo abierto ha llegado a su fin.
o good(): Es el ms genrico. Retorna false en los mismos casos en los que al llamar a las
funciones previas se hubiera obtenido true.

EJEMPLOS DE OPERACIONES SOBRE ARCHIVOS

Escribir en un archivo de texto

//escribiendo en un archivo de texto


#include <iostream.h>
#include <fstream.h>

void main(void)
{
ofstream ejemplo("ejemplo.txt"); //crea un archivo de salida
if(ejemplo.good()) //comprueba si el archivo esta abierto
{
//enviamos dos cadenas al archivo de salida
ejemplo<<"Esto es una linea.\n";
ejemplo<<"Esto es otra linea. \n";

ejemplo.close(); //cierra el acceso al archivo


ejemplo.clear(); //limpia buffer lectura del flujo del archivo
}
}

Leer contenido de un archivo de texto:

//leer un archivo de texto


#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

void main(void)
{
char buffer[256];

ifstream ejemplo("ejemplo.txt");
if(!ejemplo.good())
{
cout<<"Error al abrir el archivo";
}

2 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

else
{
while(!ejemplo.eof())
{
ejemplo.getline(buffer,100);
cout<<buffer<<endl;
}
system("pause");
}
}

El resultado del cdigo anterior debe ser el siguiente:

FUNCIONES DE CONVERSIN DE DATOS

Gracias al registro de datos dentro de archivos de texto, se logra almacenar diferente tipo de
informacin en los mismos, por ej.: fechas, nombres, descripciones, cantidades, distancias, etc.
Como complemento a esta interaccin con informacin almacenada en archivos, se necesita
conocer un conjunto de funciones definidas en la librera stdlib.h, que permiten convertir texto
en representaciones numricas y viceversa. A continuacin se describen las ms utilizadas.

Funcin itoa()

char *itoa(int value, char *str, int Base);

Convierte un valor entero (value) a una cadena de caracteres (str), indicando opcionalmente a la
base (Base) del sistema numrico en la que se expresar la respuesta. Ejemplo:

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,2);
cout<<endl<<"binario sera "<<buffer;

Una salida del cdigo anterior sera:

Funcin atoi()

int atoi (const char *str)

3 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

Retorna la conversin a valor entero de una cadena de caracteres (str)

La cadena puede contener caracteres adicionales despus de los que forman el nmero entero,
que seran ignorados y no tienen ningn efecto sobre el comportamiento de esta funcin.
Si el inicio de la secuencia de caracteres en str (que no sean espacios en blanco) no representan
un nmero entero vlido, o si no existe tal secuencia, ya sea porque str est vaco o slo
contiene espacios en blanco, la conversin no se realiza y la funcin devuelve cero (0).

Ejemplo:

int i;
char buffer[5];
cout<<"Ingrese un numero entero: ";
cin>>buffer;
i=atoi(buffer);
i=i*2;
cout<<"El doble del valor ingresado es: "<<i;

Una salida del cdigo anterior podra ser:

Funcin atof()

double atof (const char* str);

Retorna un valor double de la conversin de un string.


Comienza de izquierda a derecha, buscando la secuencia vlida de una representacin numrica.
En caso de un carcter no vlido, ignora la cadena restante.

Ejemplo de uso:

double n,m;
double pi=3.1415926535;
char buffer[20];
cout<<"Ingrese valor de grados sexagesimales: ";
cin>>buffer;
n=atof(buffer); //convierte cadena buffer a valor double
m=sin(n*pi/180); //convierte numericamente a grados radianes
cout<<"Valor de "<<n<<" grados sexagesimales en radianes son: "<<m;

Ejemplo de salida:

III. PROCEDIMIENTO

PREPARAR UNA CARPETA DENOMINADA ARCHIVOS, EN LA CUAL GUARDAR CADA UNO DE LA CPPS DEL
PROCEDIMIENTO Y DE LOS PROBLEMAS A RESOLVER.

4 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

PARTE 1: CREANDO UN ARCHIVO DE TEXTO PLANO (.txt)

Crear un nuevo archivo de cdigo fuente denominado ejemplo1 y digite el siguiente cdigo

#include <iostream.h>

//biblioteca de C++ que proporciona "funciones" y operadores


//para el manejo de archivos
#include <fstream.h>
#include <stdlib.h>

void main(void)
{
ofstream archivo; //crea un objeto de la clase ofstream
char nom[25];
cout<<"DEMOSTRACION ACCESO A UN ARCHIVO DE TEXTO\n";

//abre el archivo en forma de escritura (ios::out)


archivo.open("agenda.txt",ios::out);

//comprueba si el 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 el 1er nombre a registrar en archivo: ";
cin>>nom;

//escribe nombre en archivo


archivo<<"1er nombre: "<<nom<<endl;
cout<<"Ahora escriba 2do nombre: "; cin>>nom;

//escribe nombre de nuevo en archivo


archivo<<"2do nombre: "<<nom<<endl;
archivo.close(); //cierra el manejador de archivo
cout<<"!!!Los datos fueron agregados!!!"<<endl;
}
cout<<endl;
system("pause");
}

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

5 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

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?

Cerrar ventana del archivo agenda.txt y retornar al editor de C++. Cambia el nombre del archivo
agenda.txt, 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.

Retorne al cdigo fuente del programa y restaure el nombre del archivo a crear como
agenda.txt. Adems reemplazar el parmetro resaltando ios::out por el modo de agregar
archivo (ios::app).

Ejecutar nuevamente el programa e indicar 2 nuevos nombres.


Retorne de nuevo al contenido del archivo agenda.txt y compare los resultados con las
ejecuciones anteriores.

ACCEDIENDO AL CONTENIDO DE UN ARCHIVO DE TEXTO PLANO (.txt)

Guardar los cambios del archivo cpp actual y hacer una copia del mismo bajo el nombre
Ejemplo2.
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.

Digite el siguiente cdigo entre las llaves { } de main del cpp.

Ejemplo:

ifstream archivo2; //varianle para acceso de lectura a un archivo


char nombrearchivo[50]; //nom archibo a leer, dado por usuario
char lineatexto[100]; //una linea de texto copiada desde archivo a leer
int cl=0; //contador de lineas leidas de archivo
cout<<"Indique nombre de archivo a acceder para lectura: ";
cin>>nombrearchivo;
archivo2.open(nombrearchivo,ios::in);

if(!archivo2)
{
cout<<"-> Error, archivo imposible de abrir\n";
}
else
{
cout<<"-> Acceso exitoso para lectura de archivo ";
cout<<nombrearchivo<<"\nSu contenido linea x linea:\n";
//comienza proceso lectura archivo
//repetira lectura solo cuando no se alcance final contenido

while(!archivo2.eof())
{
archivo2>>lineatexto;

6 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

cl++;
cout<<cl<<":\t"<<lineatexto<<endl;
}
archivo2.close(); //cierra acceso archivo de lectura
}

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.
Repita el paso anterior, pero digite el nombre del archivo de texto ya existente (agenda.txt)
Del resultado devuelto, Qu es lo que realmente est leyndose del archivo con la lnea de
cdigo resaltada archivo2>>lineatexto?

Comente la lnea resaltada del paso anterior e inserte en su lugar este comando:

archivo2.getline(lineatexto,100);

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?

ALMACENANDO/RECUPERANDO INFORMACIN DE APLICACIONES HACIA/DESDE


ARCHIVO DE TEXTO PLANO (.txt)

Crear un nuevo archivo cpp, para guardarlo bajo el nombre Ejemplo3. En este ejemplo, se permite
el ingreso de los datos de un total de n cuentas de ahorro, para luego ir agregndolos dato por
dato hacia un archivo de cuentas (llamado cliente.txt).

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

void main(void)
{
//datos cuenta ahorro
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 el programa si no se puede crear el archivo


if(!archivoclientessalida)
{
cout<<"No se puede abrir el archivo"<<endl;
}
else
{
cout<<endl<<"Digite el numero de clientes a ingresar: ";

7 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

cin>>n;
i=1; //inicia con empleado 1
//lee cuenta, nombre y saldo con cin
while(i<=n)
{
cout<<"\n\nDatos de Cuena (#"<<i<<"):\n";
cout<<"\nNumero de cuenta:\t"; cin>>cuenta;
cout<<"Nombres:\t"; gets(nombre);
cout<<"Apellidos:\t"; gets(apellido);
cout<<"Saldo inicial(S/.):\t"; cin>>saldo;
//escribe variables anteriores en el archivo de salida

archivoclientessalida<<cuenta<<endl<<nombre<<endl<<apellido<<endl
archivoclientessalida <<saldo<<endl;
i++; //proximo empleado a registrar
}
//cierra acceso archivo de escritura
archivoclientessalida.close();
cout<<"\nSE TERMINO DE AGREGAR DATOS AL ARCHIVO\n";
}
cout<<endl;
system("pause");
}

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.

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.

Crear un nuevo archivo cpp, para guardarlo bajo el nombre Ejemplo4. 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.h>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <stdio.h>

void main(void)
{
//datos cuenta ahorro
char linea[10];
int cuenta;
char nombre[15];
char apellido[15];
double saldo;
int n,i;

//ifstream abre el archivo en forma de lectura


ifstream archivoclientesentrada("cliente.txt",ios::in);

8 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

//finaliza el programa si no se puede abrir el archivo


if(!archivoclientesentrada)
{
cout<<"No se puede abrir el archivo"<<endl;
}
else
{
cout<<"LISTA 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);
cout<<"Apellido"<<setw(16)<<"Saldo(S/.)"<<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

if(cuenta==0)
{
break; //finaliza while
}

archivoclientesentrada.getline(nombre,25);
archivoclientesentrada.getline(apellido,25);

archivoclientesentrada.getline(linea,9);
saldo=atof(linea); //convierte cadena texto en valor float

//muestra resultados en pantalla


cout<<setw(5)<<cuenta<<setw(25)<<nombre<<setw(25)<<apellido;
cout<<setw(10)<<saldo<<endl;
}
archivoclientesentrada.close();
}
cout<<endl;
system("pause");
}

Compilar y ejecutar el programa. Confirmar que los datos mostrados en la consola son los mismos
almacenados en el archivo de texto cliente.txt.

IV. ACTIVIDAD PROPUESTA

Elabore el cdigo fuente de C++ que solucionen a cada uno de los problemas a continuacin:

Problema1.cpp:
Escriba un programa que lea una serie de caracteres y cree un archivo con ellos

9 T/23/11/2017
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN
ESCUELA PROFESIONAL DE INGENIERA EN INFORMATICA Y SISTEMAS FACULTAD DE INGENIERIA
CURSO : PROGRAMACIN AVANZADA
AO DE ESTUDIOS : SEGUNDO CICLO

Problema2.cpp:
Escriba un programa que lea el nombre de un archivo y muestre su contenido por pantalla.

Problema3.cpp:
Escriba un programa que lea un archivo y lo copie hacia otro.

Problema4.cpp:
Lea 2 archivos y nalos hacia un tercer archivo.

Problema5.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 impuesto y $60 por un seguro
contra accidentes.
Almacenar en un archivo de texto denominado planilla.txt a la siguiente informacin:
Informacin de cada uno de sus empleados: nombres, cdigo (formado por las 2 letras
iniciales de su 1er nombre y las 2 letras iniciales de su 1er apellido), su salario base y
salario neto.
Monto de la planilla a pagar, as como el sueldo neto promedio general

Importante:
Los registros deben ser almacenados en el archivo, ordenados por el 1er apellido de los
empleados.
El contenido del archivo debe quedar en un formato listo para imprimir, simulando una
tabla

10 T/23/11/2017