CONTENIDO DE LA LECCIÓN 8

CONTENIDO DE LA LECCIÓN 8 CONTENIDO DE LA LECCIÓN 8

azul2.bnct.ipn.mx
from azul2.bnct.ipn.mx More from this publisher
06.05.2013 Views

MIGUEL Á. TOLEDO MARTÍNEZ La función read de istream introduce un número específico de bytes desde la posición actual en el flujo especificado hacia un objeto. Así: creditoEntrada.read(reinterpret_cast(&cliente), sizeof(datoCliente)); lee el número de bytes especificados por sizeof(datoCliente) desde el archivo asociado con el objeto creditoEntrada de ifstream y almacena los datos en la estructura cliente. Observe que la función read requiere un primer argumento de tipo char *. Debido a que &cliente es de tipo datoCliente *, debe convertirse a char * por medio del operador de conversión mediante cast reinterpre_cast. Observe que el programa incluye el archivo de encabezado clntdata.h. El programa lee secuencialmente cada uno de los registros del archivo credito.dat, revisa cada registro para ver si contiene datos y despliega salidas formateadas para los registros que contienen datos. La condición: while(creditoEntrada && !creditoEntrada.eof()) utiliza la función miembro eof() de ios para determinar si se ha llegado al final del archivo y causa que termine la ejecución de la estructura while. Asimismo, si hay algún error en la lectura del archivo, el ciclo terminará debido a que creditoEntrada se evaluará como false. lineaSalida (que toma dos argumentos, un objeto ostream y una estructura datoCliente que se enviará a la salida) envía a la salida la entrada de datos del archivo. El tipo del parámetro de ostream es interesante, debido a que cualquier objeto ostream (tal como cout) o cualquier objeto de una clase derivada de ostream (tal como un objeto de tipo ofstream) se puede proporcionar como argumento. Esto significa que la misma función puede utilizarse, por ejemplo, para realizar la salida hacia el flujo de salida estándar y hacia un flujo de archivo sin escribir funciones separadas. ¿Qué hay acerca del beneficio adicional? Si examina la ventana de salida, ¡observará que los registros están listados en orden (por número de cuenta)! Esta es una consecuencia simple de la forma en que almacenamos estos registros en el archivo mediante técnicas de acceso directo. En comparación al ordenamiento de burbuja que hemos visto, el ordenamiento con técnicas de acceso directo es extremadamente rápido. La velocidad se logra haciendo que el archivo sea lo suficientemente grande como para almacenar todo registro posible que pueda crearse. Esto significa, por supuesto, que el archivo podría estar ocupado en forma dispersa la mayor parte del tiempo, lo que es un desperdicio de almacenamiento. Por lo tanto , éste es otro ejemplo del compromiso del espacio contra el tiempo: mediante el uso de grandes cantidades de espacio somos capaces de desarrollar un algoritmo de ordenamiento mucho más rápido. EJEMPLO: UN PROGRAMA DE PROCESAMIENTO DE TRANSACCIONES Ejemplo 7.29 Ahora presentaremos un programa sustancial: TRANSAC.CPP, de procesamiento de transacciones, que utiliza un archivo de acceso aleatorio para lograr un procesamiento de acceso instantáneo. El programa mantiene información de cuentas bancarias, actualiza cuentas existentes, agrega nuevas cuentas, borra cuentas y almacena un listado formateado de todas las cuentas actuales en un archivo de texto para impresión. Asumimos que ya se ejecutaron los programa ALEATORIO.CPP para crear el archivo credito.dat y el programa ESCRIALEA.CPP para insertar los datos iniciales. FUNDAMENTOS – LECCIÓN 7 7-50

MIGUEL Á. TOLEDO MARTÍNEZ El programa tiene cinco opciones (la opción 5 es para terminar el programa). La opción 1 llama a la función archivoTexto() para almacenar una lista formateada de toda la información de cuentas en un archivo de texto, llamado imprimir.txt, que puede imprimirse posteriormente. La función archivoTexto() toma un objeto fstream como argumento para utilizarlo a fin de introducir datos desde el archivo credito.dat. La función archivoTexto() utiliza la función miembro read de istream y las técnicas de acceso de archivo secuencial para introducir los datos de credito.dat. La función lineaSalida(), ya en programas anteriores estudiada se utiliza para enviar los datos al archivo imprimir.txt. Observe que archivoTexto() utiliza la función miembro seekg de istream para asegurarse de que el apuntador de posición de archivo esté al inicio del archivo. La opción 2 llama a la función actualizarRegistro() para actualizar una cuenta. La función sólo actualizará un registro existente, por lo que la función primero determina si el registro especificado está vacío. El registro se lee en la estructura cliente mediante la función miembro read de istream, después cliente.numeroCuenta se compara contra cero para determinar si el registro contiene información. Si cliente.numeroCuenta es cero, se imprime un mensaje indicando que el registro está vacío y se despliegan las selecciones del menú. Si el registro contiene información, la función actualizarRegistro() despliega el registro en pantalla mediante la función lineaSalida(), introduce la cantidad de transacciones, calcula el nuevo saldo y vuelve a escribir el registro en el archivo. La opción 3 llama a la función nuevoRegistro() para agregarle una nueva cuenta al archivo. Si el usuario introduce el número de una cuenta existente, nuevoRegistro() despliega un mensaje indicando que la cuenta existe y despliega las alternativas del menú. La opción 4 llama a la función borrarRegistro() para borrar un registro del archivo. Al usuario se le pide que introduzca un número de cuenta. Sólo puede borrarse un registro existente, por lo que si la cuenta especificada está vacía, se emite un mensaje de error. Si la cuenta existe, se reinicializa copiando un registro vacío (clienteBlanco) al archivo. Se despliega un mensaje para informar al usuario que se ha borrado el registro. El archivo credito.dat se abre mediante la creación de un objeto fstream para lectura y escritura usando los modos ios::in e ios::out a los que se les aplicó un OR. /* El siguiente programa: TRANSAC.CPP, lee de manera secuencial un archivo de acceso aleatorio, actualiza los datos que ya están escritos en el archivo, crea nuevos datos a colocarse en el archivo y borra datos que ya están en el archivo. */ #include //Para cout y cin #include //Para los objetos entraSaleCredito, archivoImprimir #include //Para setw() #include //Para exit() #include "c:\apuntes1 c++\programas fuentes\leccion 07\clntdata.h" int pedirSeleccion(); void archivoTexto(fstream &); void actualizarRegistro(fstream &); void nuevoRegistro(fstream &); void borrarRegistro(fstream &); void lineaSalida(ostream &, const datoCliente &); int obtenerCuenta(const char *); enum seleccion{ARCHIVOTEXTO = 1, ACTUALIZAR, NUEVO, BORRAR, FIN}; FUNDAMENTOS – LECCIÓN 7 7-51

MIGUEL Á. TOLEDO MARTÍNEZ<br />

El programa tiene cinco opciones (la opción 5 es para terminar el programa). La opción 1 llama<br />

a la función archivoTexto() para almacenar una lista formateada de toda la información de<br />

cuentas en un archivo de texto, llamado imprimir.txt, que puede imprimirse posteriormente. La<br />

función archivoTexto() toma un objeto fstream como argumento para utilizarlo a fin de<br />

introducir datos desde el archivo credito.dat. La función archivoTexto() utiliza la función<br />

miembro read de istream y las técnicas de acceso de archivo secuencial para introducir los datos<br />

de credito.dat. La función lineaSalida(), ya en programas anteriores estudiada se utiliza para<br />

enviar los datos al archivo imprimir.txt. Observe que archivoTexto() utiliza la función miembro<br />

seekg de istream para asegurarse de que el apuntador de posición de archivo esté al inicio del<br />

archivo.<br />

La opción 2 llama a la función actualizarRegistro() para actualizar una cuenta. La función sólo<br />

actualizará un registro existente, por lo que la función primero determina si el registro<br />

especificado está vacío. El registro se lee en la estructura cliente mediante la función miembro<br />

read de istream, después cliente.numeroCuenta se compara contra cero para determinar si el<br />

registro contiene información. Si cliente.numeroCuenta es cero, se imprime un mensaje<br />

indicando que el registro está vacío y se despliegan las selecciones del menú. Si el registro<br />

contiene información, la función actualizarRegistro() despliega el registro en pantalla mediante<br />

la función lineaSalida(), introduce la cantidad de transacciones, calcula el nuevo saldo y vuelve<br />

a escribir el registro en el archivo.<br />

La opción 3 llama a la función nuevoRegistro() para agregarle una nueva cuenta al archivo. Si<br />

el usuario introduce el número de una cuenta existente, nuevoRegistro() despliega un mensaje<br />

indicando que la cuenta existe y despliega las alternativas del menú.<br />

La opción 4 llama a la función borrarRegistro() para borrar un registro del archivo. Al usuario<br />

se le pide que introduzca un número de cuenta. Sólo puede borrarse un registro existente, por lo<br />

que si la cuenta especificada está vacía, se emite un mensaje de error. Si la cuenta existe, se<br />

reinicializa copiando un registro vacío (clienteBlanco) al archivo. Se despliega un mensaje para<br />

informar al usuario que se ha borrado el registro.<br />

El archivo credito.dat se abre mediante la creación de un objeto fstream para lectura y escritura<br />

usando los modos ios::in e ios::out a los que se les aplicó un OR.<br />

/* El siguiente programa: TRANSAC.CPP, lee de manera secuencial un archivo de acceso<br />

aleatorio,<br />

actualiza los datos que ya están escritos en el archivo, crea nuevos datos a colocarse en el<br />

archivo y borra datos que ya están en el archivo.<br />

*/<br />

#include //Para cout y cin<br />

#include //Para los objetos entraSaleCredito, archivoImprimir<br />

#include //Para setw()<br />

#include //Para exit()<br />

#include "c:\apuntes1 c++\programas fuentes\leccion 07\clntdata.h"<br />

int pedirSeleccion();<br />

void archivoTexto(fstream &);<br />

void actualizarRegistro(fstream &);<br />

void nuevoRegistro(fstream &);<br />

void borrarRegistro(fstream &);<br />

void lineaSalida(ostream &, const datoCliente &);<br />

int obtenerCuenta(const char *);<br />

enum seleccion{ARCHIVOTEXTO = 1, ACTUALIZAR, NUEVO, BORRAR, FIN};<br />

FUNDAMENTOS – <strong>LECCIÓN</strong> 7 7-51

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!