He estado intentando crear un programa que simule una base de datos utilizando un archivo de acceso directo. Sin embargo, me han surgido unos cuantos problemas con el código:
-No reconoce si el archivo está vacío para comunicárselo al usuario.
-Muestra dos veces las cuentas creadas, en lugar de una.
-No borra las cuentas (que en realidad lo que se hace, en lugar de borrar texto, sustituir este por un "usuario vacio" que se ignora y no es mostrado).
-No reconoce si el archivo está vacío para comunicárselo al usuario.
-Muestra dos veces las cuentas creadas, en lugar de una.
-No borra las cuentas (que en realidad lo que se hace, en lugar de borrar texto, sustituir este por un "usuario vacio" que se ignora y no es mostrado).
Código (c) [Seleccionar]
#include <stdio.h>
#include <string.h>
struct fichaCliente { // tamaño: 68 bits
int cuenta;
char nombre[15], apellidos[45];
float dinero;
} cliente, clienteVacio = {0, "", "", 0.0};
short numero_cuentas = 0;
void mostrarClientes(FILE *);
void editarCliente(FILE *);
void crearCliente(FILE *);
void eliminarCliente(FILE *);
void comprobarCantidad(FILE *);
void asistenteCreacionCliente(int);
int main() {
int opcion;
FILE *basedatos;
if (!(basedatos = fopen("base_de_datos.dat", "a+"))) perror("No se ha podido abrir el fichero.\n");
else {
do {
printf("%s\n%s\n%s\n%s\n%s\n%s\n", "¿Que desea hacer?", "1. Mostrar todos los clientes existentes y sus datos",
"2. Editar algun dato de algun cliente existente", "3. Crear una cuenta para un nuevo cliente",
"4. Eliminar un cliente de la lista", "5. Salir del programa");
fflush(stdin);
scanf(" %i", &opcion);
rewind(basedatos);
comprobarCantidad(basedatos);
rewind(basedatos);
switch(opcion) {
case 1:
mostrarClientes(basedatos);
break;
case 2:
editarCliente(basedatos);
break;
case 3:
crearCliente(basedatos);
break;
case 4:
eliminarCliente(basedatos);
break;
case 5:break;
default:
printf("Opcion no correcta.\n");
break;
}
putchar('\n');
} while (opcion != 5);
}
fclose(basedatos);
return 0;
}
void mostrarClientes(FILE *fichero) {
if (feof(fichero)) {
printf("Error: el fichero esta vacio.\n");
return;
}
printf("%-9s%-16s%-41s%s\n", "Cuenta", "Nombre", "Apellidos", "Dinero");
while(!feof(fichero)) {
fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
if (cliente.cuenta != 0) {
printf("%-9i%-16s%-41s%.2f", cliente.cuenta, cliente.nombre, cliente.apellidos, cliente.dinero);
putchar('\n');
}
}
}
void editarCliente(FILE *fichero) {
if (feof(fichero)) {
printf("Error: el fichero esta vacio.\n");
return;
}
int cuenta, opcion;
float temporal;
printf("Introduzca el numero de cuenta del cliente: ");
fflush(stdin);
scanf(" %i", &cuenta);
if (cuenta > numero_cuentas) {
printf("El cliente no existe. Cree una cuenta para el.\n");
} else {
fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
fread(&cliente, sizeof(struct fichaCliente), 1, SEEK_SET);
if (!strcmp(cliente.nombre, "")) printf("La cuenta %i contiene un cliente vacio.\n", cuenta);
else {
do {
printf("Que desea modificar?\n%s\n%s\n%s\n%s\n%s\n", "1. Nombre del cliente",
"2. Apellidos del cliente", "3. Dinero del cliente", "4. Añadir/quitar dinero",
"5. Cancelar operacion");
fflush(stdin);
scanf(" %i", &opcion);
switch (opcion) {
case 1:
printf("Introduzca el nuevo nombre del cliente: ");
fflush(stdin);
scanf(" %[^\n]", cliente.nombre);
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
break;
case 2:
printf("Introduzca los nuevos apellidos del cliente: ");
fflush(stdin);
scanf(" %[^\n]", cliente.apellidos);
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
break;
case 3:
printf("Introduzca la cantidad actual de dinero del cliente: ");
fflush(stdin);
scanf(" %f", &cliente.dinero);
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
break;
case 4:
printf("Introduzca la cantidad de dinero a añadir/quitar (+/-): ");
fflush(stdin);
scanf(" %f", &temporal);
cliente.dinero += temporal;
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
break;
case 5:break;
default:printf("Opcion invalida.\n\n");break;
}
} while (opcion != 5);
}
}
}
void crearCliente(FILE *fichero) {
int cuenta;
short i, distancia;
char respuesta;
printf("Introduzca el numero de cuenta que desea utilizar: ");
fflush(stdin);
scanf(" %i", &cuenta);
if(cuenta > numero_cuentas) {
distancia = cuenta - numero_cuentas;
while(fgetc(fichero) != EOF);
for (i = 0; i < distancia; i++) {
fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
}
//fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
asistenteCreacionCliente(cuenta);
cliente.cuenta = cuenta;
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
} else {
fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
if (cliente.cuenta == 0) {
asistenteCreacionCliente(cuenta);
cliente.cuenta = cuenta;
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
} else {
printf("¡El numero de cuenta ya contiene un cliente! ¿Desea continuar? (s/n) ");
do {
fflush(stdin);
respuesta = getchar();
switch (respuesta) {
case 's':
asistenteCreacionCliente(cuenta);
cliente.cuenta = cuenta;
fwrite(&cliente, sizeof(struct fichaCliente), 1, fichero);
break;
case 'n':break;
default: printf("Opcion incorrecta.\n");
}
} while (respuesta != 'n' && respuesta != 's');
}
}
}
void eliminarCliente(FILE *fichero) {
if (feof(fichero)) {
printf("Error: el fichero esta vacio.\n");
return;
}
int cuenta;
printf("Introduzca el numero de cuenta a eliminar: ");
fflush(stdin);
scanf(" %i", &cuenta);
if(cuenta > numero_cuentas) {
printf("Error: el cliente con el numero de cuenta %i no existe.\n", cuenta);
} else {
fseek(fichero, sizeof(struct fichaCliente) * (cuenta-1), SEEK_SET);
fwrite(&clienteVacio, sizeof(struct fichaCliente), 1, fichero);
printf("El cliente %i ha sido eliminado satisfactoriamente.\n", cuenta);
}
}
void comprobarCantidad(FILE *fichero) {
while(!feof(fichero)) {
fread(&cliente, sizeof(struct fichaCliente), 1, fichero);
numero_cuentas++;
}
}
void asistenteCreacionCliente(int cuenta) {
char correcto;
do {
printf("Introduzca el nombre del cliente con cuenta %i: ", cuenta);
fflush(stdin);
scanf(" %[^\n]", cliente.nombre);
printf("Introduzca los apellidos del cliente con cuenta %i: ", cuenta);
fflush(stdin);
scanf(" %[^\n]", cliente.apellidos);
printf("Introduzca la cantidad de dinero que el cliente con numero de cuenta %i posee: ", cuenta);
fflush(stdin);
scanf(" %f", &cliente.dinero);
if (strcmp(cliente.nombre, " ") == 0 && strcmp(cliente.apellidos, " ") == 0) correcto = 'n';
else correcto = 's';
if (correcto == 'n') printf("Los datos introducidos no son validos.\n");
} while (correcto == 'n');
}