TheWarrior | |
| 2011-06-09 16:04 - Respuestas: 0 - Tema nº: 2797014
Windows 7 Ultimate, 4 GB RAM, Intel i5
el siguiente codigo me esta dando problemas: no crea bien los usuarios, no los edita ni los borra correctamente... (codigo en c):
#include
#include
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);
printf("%i\n", numero_cuentas);
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 (fgetc(fichero) == eof) {
printf("error: el fichero esta vacio.\n");
return;
}
rewind(fichero);
printf("\n%-9s%-16s%-41s%s\n", "cuenta", "nombre", "apellidos", "dinero");
do {
fread(&cliente, sizeof(struct fichacliente), 1, fichero);
if (feof(fichero)) // si se omite esto imprimira la ultima cuenta dos veces
if (cliente.cuenta != 0) {
printf("%-9i%-16s%-41s%.2f", cliente.cuenta, cliente.nombre, cliente.apellidos, cliente.dinero);
putchar('\n');
}
} while(!feof(fichero));
}
void editarcliente(file *fichero) {
if (fgetc(fichero) == eof) {
printf("error: el fichero esta vacio.\n");
return;
}
//rewind(fichero); < innecesario
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;
fseek(fichero, sizeof(struct fichacliente) * numero_cuentas, seek_set);
for (i = 1; i < distancia; i++) { // antiguo enunciado: for (i = 0; i < distancia; i++); error: i = 0
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;
fseek(fichero, sizeof(struct fichacliente) * (cuenta - 1), seek_set);
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;
fseek(fichero, sizeof(struct fichacliente) * (cuenta - 1), seek_set);
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 (fgetc(fichero) == eof) {
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) {
if (fgetc(fichero) == eof) return;
rewind(fichero);
numero_cuentas = 0;
do {
fread(&cliente, sizeof(struct fichacliente), 1, fichero);
if (feof(fichero)) numero_cuentas++; // si se hace directamente numero_cuentas++ no funcionara correctamente
} while(!feof(fichero));
}
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');
}
| |
|
|