Código en C para Gestión de Usuarios y Compras con Ficheros Binarios: Funciones de Login, Registro y Resumen
Gestión de Usuarios y Compras en C mediante Ficheros Binarios
A continuación se presenta un conjunto de funciones en lenguaje C que permiten gestionar usuarios y compras almacenados en ficheros binarios. El código incluye operaciones de autenticación, alta de compras, eliminación de usuarios, generación de resúmenes y modificación de contraseñas.
1. Comprobación de usuario
La función comprobarUsuario verifica que el login exista en el fichero de usuarios y que la contraseña sea correcta.
int comprobarUsuario(char nombreFichero[], char login[], char password[]){
FILE *f;
struct datosRegistro reg;
f = fopen(nombreFichero, "rb");
if(f == NULL){
printf("\nError al abrir el fichero");
return 0;
}
fread(®, sizeof(struct datosRegistro), 1, f);
while(!feof(f)){
if(strcmp(reg.login, login) == 0){
fclose(f);
if(strcmp(reg.password, password) == 0){
return 1;
}else{
printf("\nPassword incorrecta");
return 0;
}
}
fread(®, sizeof(struct datosRegistro), 1, f);
}
fclose(f);
printf("\nNo existe usuario con ese login");
return 0;
}
}
2. Añadir compra
La función añadirCompra solicita las credenciales del usuario, valida el acceso mediante comprobarUsuario y, si es correcto, registra la compra en el fichero correspondiente.
void añadirCompra(char nombreFicheroUsuarios[], char nombreFicheroCompras[]){
FILE *f;
struct datosCompra compra;
char password[20];
printf("\nIntroduce login:");
scanf("%s",compra.login);
printf("\nIntroduce password:");
scanf("%s",password);
if(comprobarUsuario(nombreFicheroUsuarios, compra.login, password) == 0){
return;
}
printf("\nIntroduce codigo concierto:");
scanf("%s",compra.codigoConcierto);
printf("\nIntroduce numero entradas:");
scanf("%d",&compra.numeroEntradas);
f = fopen(nombreFicheroCompras, "ab");
if(f == NULL){
printf("\nError al abrir fichero compras");
return;
}
fwrite(&compra, sizeof(struct datosCompra), 1, f);
fclose(f);
printf("\nCompra añadida correctamente");
}
3. Eliminar usuario
La función eliminarUsuario copia todos los registros excepto el del usuario indicado a un fichero auxiliar, que después sustituye al original.
void eliminarUsuario(char nomFUsuarios[]){
FILE *f; FILE *aux;
struct datosRegistro usuario;
char login[40]; char password[20]; int eliminado = 0;
printf("Introduce el login del usuario:");
scanf("%s",login);
printf("Introduce el password del usuario:");
scanf("%s",password);
if(comprobarUsuario(nomFUsuarios, login, password) == 0){ return; }
f = fopen(nomFUsuarios, "rb");
aux = fopen("auxUsuarios", "wb");
if(f == NULL || aux == NULL){ printf("Error al abrir el archivo"); return; }
fread(&usuario, sizeof(struct datosRegistro), 1, f);
while (!feof(f)) {
if(strcmp(usuario.login, login) == 0){
eliminado = 1;
}else{
fwrite(&usuario, sizeof(struct datosRegistro), 1, aux);
}
fread(&usuario, sizeof(struct datosRegistro), 1, f);
}
fclose(f); fclose(aux);
if(eliminado == 1){
remove(nomFUsuarios); rename("auxUsuarios", nomFUsuarios);
printf("Usuario eliminado correctamente");
}else{
remove("auxUsuarios"); printf("No se pudo eliminar el usuario");
}
}
4. Generar resumen de entradas por usuario
La función generarResumen recorre el fichero de usuarios y, para cada uno, suma el número total de entradas compradas. El resultado se guarda en resumen.txt.
void generarResumen(char nomFUsuarios[], char nomFCompras[]){
FILE *fUsuarios; FILE *fCompras; FILE *fTexto;
struct datosRegistro usuario; struct datosCompra compra;
int total;
fUsuarios = fopen(nomFUsuarios, "rb");
fTexto = fopen("resumen.txt", "w");
if(fUsuarios == NULL || fTexto == NULL){
printf("\nError al abrir algun fichero");
return;
}
fread(&usuario, sizeof(struct datosRegistro), 1, fUsuarios);
while(!feof(fUsuarios)){
total = 0;
fCompras = fopen(nomFCompras, "rb");
if(fCompras == NULL){
printf("\nError al abrir compras");
fclose(fUsuarios);
fclose(fTexto);
return;
}
fread(&compra, sizeof(struct datosCompra), 1, fCompras);
while(!feof(fCompras)){
if(strcmp(usuario.login, compra.login) == 0){
total = total + compra.numeroEntradas;
}
fread(&compra, sizeof(struct datosCompra), 1, fCompras);
}
fclose(fCompras);
fprintf(fTexto, "%s %d\n", usuario.login, total);
fread(&usuario, sizeof(struct datosRegistro), 1, fUsuarios);
}
fclose(fUsuarios); fclose(fTexto);
printf("\nResumen generado correctamente");
}
5. Verificar existencia de un login
La función existeLogin comprueba si un login está registrado, sin validar la contraseña.
int existeLogin(char nombreFichero[], char login[]){
FILE *f;
struct datosRegistro reg;
f = fopen(nombreFichero, "rb");
if(f == NULL){
printf("\nError al abrir el fichero");
return 0;
}
fread(®, sizeof(struct datosRegistro), 1, f);
while(!feof(f)){
if(strcmp(reg.login, login) == 0){
fclose(f);
return 1;
}
fread(®, sizeof(struct datosRegistro), 1, f);
}
fclose(f);
return 0;
}
6. Buscar usuario en fichero ordenado
La función buscarUsuario realiza una búsqueda secuencial aprovechando que el fichero está ordenado por login, y devuelve los datos del usuario mediante un puntero.
int buscarUsuario(char nombreFichero[], char loginABuscar[], struct datosRegistro *usuarioBuscado){
FILE *f;
f = fopen(nombreFichero, "rb");
if(f == NULL){
printf("\nError al abrir fichero");
return 0;
}
fread(usuarioBuscado, sizeof(struct datosRegistro), 1, f);
while(!feof(f) && strcmp(usuarioBuscado->login, loginABuscar) < 0){
fread(usuarioBuscado, sizeof(struct datosRegistro), 1, f);
}
if(!feof(f) && strcmp(usuarioBuscado->login, loginABuscar) == 0){
fclose(f);
return 1;
}else{
fclose(f);
return 0;
}
}
7. Cambiar contraseña
La función cambiarPassword abre el fichero en modo lectura/escritura (rb+), valida el login y la contraseña actual y, si son correctos, sobrescribe el registro con la nueva contraseña.
void cambiarPassword(char nomFUsuarios[]){
FILE *f;
struct datosRegistro reg;
char loginBuscado[40]; char password[20];
printf("\nIntroduzca su login:");
scanf("%s", loginBuscado);
printf("\nIntroduzca su password actual:");
scanf("%s", password);
f = fopen(nomFUsuarios, "rb+");
if(f == NULL){ printf("\nError al abrir fichero"); return; }
fread(®, sizeof(struct datosRegistro), 1, f);
while(!feof(f) && strcmp(reg.login, loginBuscado) < 0){
fread(®, sizeof(struct datosRegistro), 1, f);
}
if(!feof(f) && strcmp(reg.login, loginBuscado) == 0){
if(strcmp(reg.password, password) == 0){
printf("\nIntroduzca la nueva password:");
scanf("%s", reg.password);
fseek(f, -sizeof(struct datosRegistro), SEEK_CUR);
fwrite(®, sizeof(struct datosRegistro), 1, f);
printf("\nPassword modificada correctamente");
}else{
printf("\nLa password actual es incorrecta");
}
}else{
printf("\nNo existe usuario con ese login");
}
fclose(f);
}
8. Listado de usuarios compradores
La función usuariosCompradores genera el fichero compradores.txt con el login y el email de cada usuario que ha realizado alguna compra.
void usuariosCompradores(char nomFCompras[], char nomFUsuarios[]){
FILE *fCompras; FILE *fTexto;
struct datosCompra compra;
struct datosRegistro usuario;
char loginActual[40] = "";
fCompras = fopen(nomFCompras, "rb");
fTexto = fopen("compradores.txt", "w");
if(fCompras == NULL || fTexto == NULL){
printf("\nError al abrir los ficheros");
return;
}
fread(&compra, sizeof(struct datosCompra), 1, fCompras);
while(!feof(fCompras)){
if(strcmp(compra.login, loginActual) != 0){
strcpy(loginActual, compra.login);
if(buscarUsuario(nomFUsuarios, loginActual, &usuario) == 1){
fprintf(fTexto, "%s - %s\n", usuario.login, usuario.email);
}
}
fread(&compra, sizeof(struct datosCompra), 1, fCompras);
}
fclose(fCompras);
fclose(fTexto);
printf("\nFichero compradores.txt generado correctamente");
}
9. Devolver producto
La función devolverProducto localiza una compra concreta (por login y código de producto), reduce en una unidad las unidades adquiridas y elimina el registro si no quedan unidades.
void devolverProducto(char nomFichero[]){
FILE *f; FILE *aux; struct datosCompra compra;
char login[40]; char codigoProducto[10];
int devuelto = 0;
f = fopen(nomFichero, "rb");
aux = fopen("auxCompras", "wb");
if(f == NULL || aux == NULL){ printf("\nError al abrir "); return; }
printf("\nIntroduzca el login:");
scanf("%s", login);
printf("\nIntroduzca el codigo del producto:");
scanf("%s", codigoProducto);
fread(&compra, sizeof(struct datosCompra), 1, f);
while(!feof(f)){
if(!devuelto && strcmp(compra.login, login) == 0 && strcmp(compra.codigoProducto, codigoProducto) == 0){
compra.unidades--;
devuelto = 1;
if(compra.unidades > 0){
fwrite(&compra, sizeof(struct datosCompra), 1, aux);
}
}else{
fwrite(&compra, sizeof(struct datosCompra), 1, aux);
}
fread(&compra, sizeof(struct datosCompra), 1, f);
}
fclose(f); fclose(aux);
if(devuelto == 1){
remove(nomFichero); rename("auxCompras", nomFichero);
printf("\nDevolucion realizada correctamente");
}else{
remove("auxCompras");
printf("\nNo se ha encontrado esa compra");
}
}