Archivos

Para la administración de información dentro de un programa, es necesario crear un archivo de almacenamiento para que el usuario lo consulte, modifique y actualice la información según se requiera

El siguiente programa crea un archivo .dat que va a almacenar información de varios usuarios, ingresa información con saldo positivo, negativo y con 0 para que puedas observar los resultados:

/* Este programa crea un archivo secuencial */

#include <stdio.h>

int main()

{

int cuenta; /* número de cuenta */

char nombre[ 30 ]; /* nombre de cuenta */

double saldo; /* saldo de la cuenta */

FILE *ptrCf; /* ptrCf = apuntador al archivo clientes.dat */

/* fopen abre el archivo. Si no es capaz de crear el archivo, sale del programa */

if ( ( ptrCf = fopen( "clientes.dat", "w" ) ) == NULL ) {

printf( "El archivo no pudo abrirse\n" );

} /* fin de if */

else {

printf( "Introduzca la cuenta, el nombre, y el saldo.\n" );

printf( "Introduzca EOF al final de la entrada.\n" );

printf( "? " );

scanf( "%d%s%lf", &cuenta, nombre, &saldo );

/* escribe la cuenta, el nombre y el saldo dentro del archivo con fprintf */

while ( !feof( stdin ) ) {

fprintf( ptrCf, "%d %s %.2f\n", cuenta, nombre, saldo );

printf( "? " );

scanf( "%d%s%lf", &cuenta, nombre, &saldo );

} /* fin de while */

fclose( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

Ahora tenemos que mostrar la información almacenada en el archivo crado en el programa anterior:

/* Lectura e impresión de un archivo secuencial */

#include <stdio.h>

int main()

{

int cuenta; /* número de cuenta */

char nombre[ 30 ]; /* nombre de cuenta */

double saldo; /* saldo de la cuenta */

FILE *ptrCf; /* ptrCf = apuntador al archivo clientes.dat */

/* fopen abre el archivo; si no se puede abrir el archivo, abandona el programa */

if ( ( ptrCf = fopen( "clientes.dat", "r" ) ) == NULL ) {

printf( "El archivo no pudo abrirse\n" );

} /* fin de if */

else { /* lee la cuenta, el nombre y el saldo del archivo */

printf( "%-10s%-13s%s\n", "Cuenta", "Nombre", "Saldo" );

fscanf( ptrCf, "%d%s%lf", &cuenta, nombre, &saldo );

/* mientras no sea fin de archivo */

while ( !feof( ptrCf ) ) {

printf( "%-10d%-13s%7.2f\n", cuenta, nombre, saldo );

fscanf( ptrCf, "%d%s%lf", &cuenta, nombre, &saldo );

} /* fin de while */

fclose( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

El siguiente programa muestra la información por estado de cuenta dependiendo del saldo del usuario:

/* Programa de investigación crediticia */

#include <stdio.h>

/* la función main comienza la ejecución del programa */

int main()

{

int consulta; /* número de solicitud */

int cuenta; /* número de cuenta */

double saldo; /* saldo de la cuenta */

char nombre[ 30 ]; /* nombre de la cuenta */

FILE *ptrCf; /* apuntador al archivo clientes.dat */

/* fopen abre el archivo; si no se puede abrir el archivo, sale del programa */

if ( ( ptrCf = fopen( "clientes.dat", "r" ) ) == NULL ) {

printf( "El archivo no pudo abrirse\n" );

} /* fin de if */

else {

/* despliega las opciones de consulta */

printf( "Introduzca la consulta\n"

" 1 - Lista las cuentas con saldo cero\n"

" 2 - Lista las cuentas con saldo a favor\n"

" 3 - Lista las cuentas con saldo en contra\n"

" 4 - Fin del programa\n? " );

scanf( "%d", &consulta );

/* procesa la consulta del usuario */

while ( consulta != 4 ) {

/* lee la cuenta, el nombre y el saldo del archivo */

fscanf( ptrCf, "%d%s%lf", &cuenta, nombre, &saldo );

switch ( consulta ) {

case 1:

printf( "\nCuentas con saldo cero:\n" );

/* lee el contenido del archivo (hasta eof) */

while ( !feof( ptrCf ) ) {

if ( saldo == 0 ) {

printf( "%-10d%-13s%7.2f\n",

cuenta, nombre, saldo );

} /* fin de if */

/* lee la cuenta, el nombre y el saldo del archivo */

fscanf( ptrCf, "%d%s%lf",

&cuenta, nombre, &saldo );

} /* fin de while */

break;

case 2:

printf( "\nCuentas con saldos a favor :\n" );

/* lee el contenido del archivo (hasta eof) */

while ( !feof( ptrCf ) ) {

if ( saldo < 0 ) {

printf( "%-10d%-13s%7.2f\n",

cuenta, nombre, saldo );

} /* fin de if */

/* lee la cuenta, el nombre y el saldo del archivo */

fscanf( ptrCf, "%d%s%lf",

&cuenta, nombre, &saldo );

} /* fin de while */

break;

case 3:

printf( "\nCuentas con saldo en contra:\n" );

/* lee el contenido del archivo (hasta eof) */

while ( !feof( ptrCf ) ) {

if ( saldo > 0 ) {

printf( "%-10d%-13s%7.2f\n",

cuenta, nombre, saldo );

} /* fin de if */

/* lee la cuenta, el nombre y el saldo del archivo */

fscanf( ptrCf, "%d%s%lf",

&cuenta, nombre, &saldo );

} /* fin while */

break;

} /* fin de switch */

rewind( ptrCf ); /* devuelve ptrCf al principio del archivo */

printf( "\n? " );

scanf( "%d", &consulta );

} /* fin de while */

printf( "Fin de la ejecucion.\n" );

fclose( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

Siguiendo con la lección, el siguiente código crea un archivo de escritura para ser utilizado posteriormente para almacenar información:

/* Creación secuencial de un archivo de acceso aleatorio*/

#include <stdio.h>

/* definición de la estructura datosCliente */

struct datosCliente {

int numCta; /* número de cuenta */

char apellido[ 15 ]; /* apellido de la cuenta */

char nombre[ 10 ]; /* nombre de la cuenta */

double saldo; /* saldo de la cuenta */

}; /* fin de la estructura datosCliente */

int main()

{

int i; /* contador utilizado para contar de 1 a 100 */

/* crea datosCliente con información predeterminada */

struct datosCliente clienteEnBlanco = { 0, "", "", 0.0 };

FILE *ptrCf; /* apuntador al archivo credito.dat */

/* fopen abre el archivo; si no se puede abrir, sale del archivo */

if ( ( ptrCf = fopen( "credito.dat", "wb" ) ) == NULL ) {

printf( "No pudo abrirse el archivo.\n" );

} /* fin de if */

else {

/* escribe 100 registros en blanco en el archivo */

for ( i = 1; i <= 100; i++ ) {

fwrite( &clienteEnBlanco, sizeof( struct datosCliente ), 1, ptrCf );

} /* fin de for */

fclose ( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

Vamos a ingresar información dentro del nuevo archivo que creamos, para esto utilizamos el siguiente código:

/* Escritura en un archivo de acceso aleatorio */

#include <stdio.h>

/* definición de la estructura datosCliente */

struct datosCliente {

int numCta; /* número de cuenta */

char apellido[ 15 ]; /* apellido de la cuenta */

char nombre[ 10 ]; /* nombre de la cuenta */

double saldo; /* saldo de la cuenta */

}; /* fin de la estructura datosCliente */

int main()

{

FILE *ptrCf; /* apuntador al archivo credito.dat */

/* crea datosCliente con información predeterminada */

struct datosCliente cliente = { 0, "", "", 0.0 };

/* fopen abre el archivo; si no lo puede abrir, sale del archivo */

if ( ( ptrCf = fopen( "credito.dat", "rb+" ) ) == NULL ) {

printf( "El archivo no pudo abrirse.\n" );

} /* fin de if */

else {

/* se requiere que el usuario especifique el número de cuenta */

printf( "Introduzca el numero de cuenta"

" ( 1 a 100, 0 para terminar la entrada )\n? " );

scanf( "%d", &cliente.numCta );

/* el usuario introduce la información, la cual se copia dentro del archivo */

while ( cliente.numCta != 0 ) {

/* el usuario introduce el apellido, el nombre y el saldo */

printf( "Introduzca el apellido, el nombre, el saldo\n? " );

/* establece los valores para apellido, nombre, y saldo del registro */

fscanf( stdin, "%s%s%lf", cliente.apellido,

cliente.nombre, &cliente.saldo );

/* localiza la posición de un registro específico en el archivo */

fseek( ptrCf, ( cliente.numCta - 1 ) *

sizeof( struct datosCliente ), SEEK_SET );

/* escribe en el archivo la información especificada por el usuario */

fwrite( &cliente, sizeof( struct datosCliente ), 1, ptrCf );

/* permite al usuario introducir otro número de cuenta */

printf( "Introduce el numero de cuenta\n? " );

scanf( "%d", &cliente.numCta );

} /* fin de while */

fclose( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

Para observar la información que acabamos de ingresar, utilizamos:

/* Lectura secuencial de un archivo de acceso aleatorio */

#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 */

int main()

{

FILE *ptrCf; /* apuntador de archivo credito.dat */

/* 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 ( ( ptrCf = fopen( "credito.dat", "rb" ) ) == NULL ) {

printf( "No pudo abrirse el archivo.\n" );

} /* fin de if */

else {

printf( "%-6s%-16s%-11s%10s\n", "Cta", "Apellido",

"Nombre", "Saldo" );

/* lee todos los registro del archivo (hasta eof) */

while ( !feof( ptrCf ) ) {

fread( &cliente, sizeof( struct datosCliente ), 1, ptrCf );

/* despliega el registro */

if ( cliente.numCta != 0 ) {

printf( "%-6d%-16s%-11s%10.2f\n",

cliente.numCta, cliente.apellido,

cliente.nombre, cliente.saldo );

} /* fin de if */

} /* fin de while */

fclose( ptrCf ); /* fclose cierra el archivo */

} /* fin de else */

return 0; /* indica terminación exitosa */

} /* fin de main */

Por último, vamos a observar el programa completo:

/* 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 incorrecta\n" );

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%10s\n",

"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.2f\n",

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.2f\n\n",

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.2f\n",

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 saldo\n? " );

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 opcion\n"

"1 - almacena un archivo de texto con formato, de las cuentas llamadas\n"

" \"cuentas.txt\" para impresion\n"

"2 - actualiza una cuenta\n"

"3 - agrega una nueva cuenta\n"

"4 - elimina una cuenta\n"

"5 - fin del programa\n? " );

scanf( "%d", &opcionMenu ); /* recibe la opción del usuario */

return opcionMenu;

} /* fin de la función introduceOpcion */

Ejercicio:

Modifica la opción 5 para que el programa muestre la información de las cuentas almacenadas en esta opción y crea la opción 6 para que está sea el fin del programa

virj