LABORATORIO #6 (Parte I y II) REGISTROS Y ARCHIVOS Parte I: Registros Un registro es una estructura de datos formado por un conjunto de elementos llamados campos, no necesariamente del mismo tipo y que permiten almacenar una serie de datos relacionados entre sí bajo un nombre común. Declaración Un registro se declara de la siguiente manera: Tipo Registro <identificador> = <Tipo de dato> 1 <Identificador> 1 ; <Tipo de dato> 2 <Identificador> 2 ;... <Tipo de dato> N <Identificador> N ; Fregistro; struct <identificador> { <tipo de dato> 1 <Identificador> 1 ; <tipo de dato> 2 <Identificador> 2 ;... <tipo de dato> N <Identificador> N ; ; En el siguiente ejemplo se declara un registro y luego variables de ese tipo de registro: //Se declara un tipo registro Tipo Registro Producto = String nombre; Entero cantidad; Real precio; Real peso; Fregistro; //Se declaran las variables de tipo producto Producto prod1, prod2; //Se declara un tipo registro struct producto { string nombre; int cantidad; float precio; float peso; ; //Se declaran las variables de tipo producto producto prod1, prod2; Operaciones A los registros se le pueden aplicar varias operaciones, como aplicar la operación constructora para inicializarlos o la operación selectora para cambiar los valores de los campos. Utilizando el registro y las variables declaradas en ejemplo anterior, se pueden aplicar las siguientes operaciones: 1
y //Se inicializa prod1 utilizando la operación constructora prod1 = { Cámara digital, 5, 800.0, 0.5; //Se inicializa prod2 utilizando la operación selectora para cada campo prod2.nombre = Impresora inalámbrica ; prod2.cantidad = 2; prod2.precio = 580.0; prod2.peso = 7.0; //Se incrementa el campo cantidad de prod1 prod1.cantidad = prod1.cantidad + 1; Pase de parámetros Para pasar un registro como parámetro a una acción o función se puede hacer de la siguiente manera: //AL DEFINIR LA ACCIÓN O FUNCIÓN: void proc(producto p){ //p es el registro de tipo producto previamente declarado //Cuerpo de la acción //AL INVOCAR A LA ACCIÓN: //se debe tener el arreglo declarado producto p3; //se invoca a la acción proc(p3); Ejemplo: A continuación se presenta un ejemplo donde se define un registro el cual representa cartas, indicando el número o cara de las cartas, así como también la pinta o palo. Este algoritmo permite definir un arreglo del tipo carta, para manejar así las cartas que forman parte de un mazo. 2
#include <iostream> using namespace ::std; /* definición de la estrcutura carta */ struct carta { string cara; /* define el campo cara */ string palo; /* define el campo palo */ ; /* fin de la estructura carta */ void llenacarta( carta wcarta[],string wcara[], string wpalo[] ); int main(){ carta mazo[52]; /* define el arreglo carta */ int i,j; /* inicializa el arreglo de cadena de caracteres */ string cara[] = { "As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Joto", "Quina", "Rey"; /* inicializa el arreglo de apuntadores */ string palo[] = { "Corazones", "Diamantes", "Treboles", "Espadas"; llenacarta( mazo, cara, palo ); /* carga el mazo con las cartas */ /* Mostrar las primeras 3 cartas de cada palo */ for(i=0;i<4;i++){ for(j=0;j<3;j++){ cout << mazo[j+i*13].cara << " de " << mazo[j+i*13].palo << endl; return 0; /* fin de main */ /* coloca cadenas dentro de las estructuras Carta */ void llenacarta( carta wcarta[], string wcara[], string wpalo[] ){ int i; /* ciclo a través de wcarta */ for ( i = 0; i <= 51; i++ ) { wcarta[i].cara = wcara[ i % 13 ]; wcarta[i].palo = wpalo[ i / 13 ]; /* fin de for */ /* fin de la función llenacarta */ Ejercicios 1. Proporcione la definición de los registros para cada uno de los siguientes casos: a. El registro fecha que contiene tres enteros dia, mes y año (anio). b. El registro persona que contiene dos cadenas de caracteres nombre y apellido, un campo del tipo fecha (definido previamente) fecha_de_nacimiento. 3
2. Partiendo de los registros definidos previamente, desarrolle un algoritmo en el cual se definan dos variables correspondientes a dos personas, solicite la información necesaria al usuario para asignarle los valores de nombre, apellido y fecha de nacimiento de cada uno y luego muestre la información por pantalla. Haga uso de procedimientos. Parte II: Archivos Un archivo es una secuencia de elementos del mismo tipo, que residen generalmente en memoria auxiliar. Los archivos son utilizados cuando se desea que los datos puedan recuperarse aún después de haber apagado la máquina y también cuando se manejan grandes volúmenes de información. Declaración Antes de empezar a utilizar un archivo se debe declarar una variable que haga referencia al archivo con el que se va a trabajar. A continuación se muestra como se puede hacer: //Declaración de dos archivos Archivo archivoentrada, archivosalida; //Inclusión de bibliotecas #include <fstream> using namespace std;... //Declaración de dos archivos fstream archivoentrada, archivosalida; Operaciones Al trabajar con archivos secuenciales se pueden realizar diversas operaciones tales como: Abrir el archivo: se debe hacer antes de hacer otras operaciones en le archivo. Cerrar el archivo: se debe hacer cuando se termina de utilizar el archivo. Verificar el fin del archivo (FDA o EOF). Leer del archivo. Escribir en el archivo. A continuación se muestran ejemplos de estas operaciones utilizando los archivos declarados anteriormente. 4
Ejemplo de abrir archivos: //Abrir archivo de texto para lectura AbrirArchivo(archivoEntrada, prueba1.txt, Lectura y Texto); //Abrir archivo de texto para escritura AbrirArchivo(archivoSalida, prueba2.txt, Escritura y Texto); //Abrir archivo de texto para lectura archivoentrada.open( prueba1.txt, ios::in); //Abrir archivo de texto para escritura archivosalida.open( prueba2.txt, ios::out); Ejemplo de lectura de un archivo caracter por caracter (asumiendo que el archivo está abierto y es de lectura): //Se declara un caracter Caracter c; //Mientras no sea el fin del archivo Mientras NO FDA(archivoEntrada) //se lee una línea y se guarda en c LeerArchivo(archivoEntrada, c); //se muestra el caracter leído Escribir(c); Fmientras //Se cierra el archivo CerrarArchivo(archivoEntrada); //Se declara un caracter char c; //Mientras no sea el fin del archivo while(!archivoentrada.eof()){ //se lee una línea y se guarda en c archivoentrada >> c; //se muestra el caracter leído cout << c; //Se cierra el archivo archivoentrada.close(); Ejemplo de escritura en un archivo (asumiendo que el archivo está abierto y es de escritura): //Se declara un String y se inicializa String cad; cad = segunda línea de escritura ; //Se escribe la primera línea EscribirArchivo(archivoSalida, primera escritura ); //Se escribe la segunda línea EscribirArchivo(archivoSalida, cad); //Se cierra el archivo CerrarArchivo(archivoSalida); //Se declara un string y se inicializa string cad; cad = segunda línea de escritura ; //Se escribe la primera línea archivosalida << primera escritura << endl; //Se escribe la segunda línea archivosalida << cad << endl; //Se cierra el archivo archivosalida.close(); 5
Ejemplos: 1.- El siguiente ejemplo permite leer la información almacenada en un archivo info.dat : #include <iostream> #include <fstream> using namespace ::std; int main(){ string nombre; float monto; fstream archivo; // Declaración para el archivo clientes.dat archivo.open( "info.dat", ios::in ); if (!archivo.is_open()){//se verifica si el archivo se ha abierto o no cout << "No se pudo abrir el archivo" << endl; else { while (!archivo.eof()){ archivo >> nombre; archivo >> monto; cout << nombre << ": " << monto << endl; archivo.close(); // cierra el archivo return 0; /* fin de main */ Toma en consideración que para ejecutar este ejemplo debes contar con un archivo info.dat, el cual puede tener inicialmente los siguientes valores: Maria 20.4 Jose 17.4 Pedro 56.7 Carlos 67.1 6
2.- El siguiente ejemplo permite crear un archivo e ingresar la información en un archivo info.dat. #include <iostream> #include <fstream> #include <stdio.h> #include <stdlib.h> using namespace ::std; int main(){ int i; string nombres[]={"maria","jose","victor","manuel"; float montos[]={323.2,643.5,231.6,784.7; fstream archivo; // Declaración para el archivo clientes.dat archivo.open( "info.dat", ios::out ); if (!archivo.is_open()){//se verifica que el archivo se haya abierto o no cout << "No se pudo abrir el archivo" << endl; else { for(i=0;i<4;i++){ archivo << nombres[i] << " " << montos[i] << endl; //Escribe la información en el archivo archivo.close(); // cierra el archivo return 0; /* fin de main */ Ejercicios: 1.- Considere que usted es el dueño de una tienda de herramientas y necesita mantener un inventario que le permita llevar un control mínimo de cuáles herramientas tiene, cuántas tiene y el costo de cada una. Escriba un programa que: a.- le permita listar todas sus herramientas b.- le permita introducir nuevas herramientas. c.- le permita actualizar la información de la cantidad de una herramienta en particular. Almacene la información en un archivo identificado como inventario.txt y considere que el mismo tiene la siguiente información inicialmente: #Registro Descripción Cantidad Costo 1 Martillo 5 55.0 2 Llave 10 73.5 3 Serrucho 14 24.4 4 Destornillador 4 56.7 7
Fuentes: Tema 7. Tipos de datos estructurados. Profa. Yusneyi Carballo. http://www.ciens.ucv.ve/algoritmosyprogramacion/documentos/profayusneyi_tema7_tiposdatosestructurad os.doc Language Tutorial: Data Structures. Juan Soulie. http://www.cplusplus.com/doc/tutorial/structures/ Language Tutorial: Input / Output with files. Juan Soulie. http://www.cplusplus.com/doc/tutorial/files/ Prep. Daniel Romero. GDAP, Nov. 2010 Rev. Prof. Adriana Liendo, Jun. 2010 8