Este programa lee de manera secuencial un archivo de acceso aleatorio, actualiza los datos ya escritos en el archivo, crea nuevos datos para colocarlos en el archivo, y elimina los datos ya existentes en el archivo.
#include <stdio.h> /* definición de la estructura datosCliente */ struct datosCliente { int numCta; /* número de cuenta */ char apellido[ 15 ]; /* apellido */ char nombre[ 10 ]; /* nombre */ double saldo; /* saldo */ }; /* fin de la estructura datosCliente */ /* prototipos */ int intOpcion( void ); void archivoTexto( FILE *ptrLee ); void actualizaRegistro( FILE *ptrF ); void nuevoRegistro( FILE *ptrF ); void eliminaRegistro( FILE *ptrF ); int main() { FILE *ptrCf; /* apuntador de archivo credito.dat */ int eleccion; /* elección del usuario */ /* fopen abre el archivo; si no se puede abrir, sale del archivo */ if ( ( ptrCf = fopen( "credito.dat", "rb+" ) ) == NULL ) { printf( "El archivo no pudo abrirse.n" ); } /* fin de if */ else { /* permite al usuario especificar una acción */ while ( ( eleccion = intOpcion() ) != 5 ) { switch ( eleccion ) { /* crea el archivo desde el registro */ case 1: archivoTexto( ptrCf ); break; /* actualiza registro */ case 2: actualizaRegistro( ptrCf ); break; /* crea registro */ case 3: nuevoRegistro( ptrCf ); break; /* elimina el registro existente */ case 4: eliminaRegistro( ptrCf ); break; /* si el usuario no selecciona una opción válida, despliega un mensaje */ default: printf( "Opcion incorrectan" ); break; } /* fin de switch */ } /* fin de while */ fclose( ptrCf ); /* fclose cierra el archivo */ } /* fin de else */ return 0; /* indica terminación exitosa */ } /* fin de main */ /* crea un archivo de texto con formato para impresión */ void archivoTexto( FILE *ptrLee ) { FILE *ptrEscribe; /* apuntador del archivo cuentas.txt */ /* crea datosCliente con información predeterminada */ struct datosCliente cliente = { 0, "", "", 0.0 }; /* fopen abre el archivo; si no se puede abrir, sale del archivo */ if ( ( ptrEscribe = fopen( "cuentas.txt", "w" ) ) == NULL ) { printf( "No pudo abrirse el archivo.n" ); } /* fin de if */ else { rewind( ptrLee ); /* establece el apuntador en el principio del archivo */ fprintf( ptrEscribe, "%-6s%-16s%-11s%10sn", "Cta", "Apellido", "Nombre","Saldo" ); /* copia todos los registros del archivo de acceso aleatorio dentro del archivo de texto */ while ( !feof( ptrLee ) ) { fread( &cliente, sizeof( struct datosCliente ), 1, ptrLee ); /* escribe un registro individual en el archivo de texto */ if ( cliente.numCta != 0 ) { fprintf( ptrEscribe, "%-6d%-16s%-11s%10.2fn", cliente.numCta, cliente.apellido, cliente.nombre, cliente.saldo ); } /* fin de if */ } /* fin de while */ fclose( ptrEscribe ); /* fclose cierra el archivo */ } /* fin de else */ } /* fin de la función archivoTexto */ /* actualiza el saldo en el registro */ void actualizaRegistro( FILE *ptrF ) { int cuenta; /* número de cuenta */ double transaccion; /* monto de la transacción */ /* crea datosCliente sin información */ struct datosCliente cliente = { 0, "", "", 0.0 }; /* obtiene el número de cuenta para actualización */ printf( "Introduzca cuenta para actualizacion ( 1 - 100 ): " ); scanf( "%d", &cuenta ); /* mueve el apuntador de archivo para corregir el registro del archivo */ fseek( ptrF, ( cuenta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* lee un registro del archivo */ fread( &cliente, sizeof( struct datosCliente ), 1, ptrF ); /* despliega un error si la cuenta no existe */ if ( cliente.numCta == 0 ) { printf( "La cuenta #%d no tiene informacion.n", cuenta ); } /* fin de if */ else { /* actualiza el registro */ printf( "%-6d%-16s%-11s%10.2fnn", cliente.numCta, cliente.apellido, cliente.nombre, cliente.saldo ); /* pide al usuario el monto de la transacción */ printf( "Introduzca el cargo ( + ) o el pago ( - ): " ); scanf( "%lf", &transaccion ); cliente.saldo += transaccion; /* actualiza el saldo del registro */ printf( "%-6d%-16s%-11s%10.2fn", cliente.numCta, cliente.apellido, cliente.nombre, cliente.saldo ); /* mueve al apuntador de archivo al registro correcto en el archivo */ fseek( ptrF, ( cuenta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* escribe el registro actualizado sobre el registro anterior en el archivo */ fwrite( &cliente, sizeof( struct datosCliente ), 1, ptrF ); } /* fin de else */ } /* fin de la función actualizaRegistro */ /* elimina el registro existente */ void eliminaRegistro( FILE *ptrF ) { struct datosCliente cliente; /* almacena los registros leÃÂÂdos en el archivo */ struct datosCliente clienteEnBlanco = { 0, "", "", 0 }; /* cliente en blanco */ int numCuenta; /* número de cuenta */ /* obtiene el número de cuenta para eliminarlo */ printf( "Introduzca el numero de cuenta a eliminar ( 1 - 100 ): " ); scanf( "%d", &numCuenta ); /* mueve el apuntador de archivo al registro correcto en el archivo */ fseek( ptrF, ( numCuenta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* lee el registro del archivo */ fread( &cliente, sizeof( struct datosCliente ), 1, ptrF ); /* si el registro no existe, despliega un error */ if ( cliente.numCta == 0 ) { printf( "La cuenta %d no existe.n", numCuenta ); } /* fin de if */ else { /* elimina el registro */ /* mueve el apuntador de archivo hacia el registro correcto en el archivo */ fseek( ptrF, ( numCuenta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* reemplaza el registro existente con un registro en blanco */ fwrite( &clienteEnBlanco, sizeof( struct datosCliente ), 1, ptrF ); } /* fin de else */ } /* fin de la función eliminaRegistro */ /* crea e inserta un registro */ void nuevoRegistro( FILE *ptrF ) { /* crea datosCliente con información predeterminada */ struct datosCliente cliente = { 0, "", "", 0.0 }; int numCuenta; /* número de cuenta */ /* obtiene el número de cuenta a crear */ printf( "Introduzca el nuevo numero de cuenta ( 1 - 100 ): " ); scanf( "%d", &numCuenta ); /* mueve el apuntador de archivo hacia el registro correcto en el archivo */ fseek( ptrF, ( numCuenta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* lee el registro desde el archivo */ fread( &cliente, sizeof( struct datosCliente ), 1, ptrF ); /* si la cuenta ya existe, despliega un error */ if ( cliente.numCta != 0 ) { printf( "La cuenta #%d ya contiene informacion.n", cliente.numCta ); } /* fin de if */ else { /* crea registro */ /* el usuario introduce el apellido, el nombre y el saldo */ printf( "Introduzca el apellido, el nombre, y el saldon? " ); scanf( "%s%s%lf", &cliente.apellido, &cliente.nombre, &cliente.saldo ); cliente.numCta = numCuenta; /* mueve el apuntador de archivo hacia el registro correcto en el archivo */ fseek( ptrF, ( cliente.numCta - 1 ) * sizeof( struct datosCliente ), SEEK_SET ); /* inserta el registro en el archivo */ fwrite( &cliente, sizeof( struct datosCliente ), 1, ptrF ); } /* fin de else */ } /* fin de la función nuevoRegistro */ /* inhabilita al usuario para introducir una opción de menú */ int intOpcion( void ) { int opcionMenu; /* variable para almacenar la opción del usuario */ /* despliega las opciones disponibles */ printf( "nIntroduzca su opcionn" "1 - almacena un archivo de texto con formato, de las cuentas llamadasn" " "cuentas.txt" para impresionn" "2 - actualiza una cuentan" "3 - agrega una nueva cuentan" "4 - elimina una cuentan" "5 - fin del programan? " ); scanf( "%d", &opcionMenu ); /* recibe la opción del usuario */ return opcionMenu; } /* fin de la función introduceOpcion */
Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.
Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:
- Si es lenguaje C [c]Código en C[/c]
- Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].
De esta manera el código coloreas el código.
Otro punto importante para muchos que sienten que se les ignora: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:Me reservo el derecho de alterar, publicar o no los comentarios as´ como cambiar mis condiciones en el momento que así lo requiera.
¿estas de acuerdo? entonces adelante que ya te he quitado bastante tiempo leyendo esta basura de advertencias :)