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