Utilizamos Cookies de terceros para generar estadísticas de audiencia y mostrar publicidad personalizada analizando tu navegación. Si sigues navegando estarás aceptando su uso. Más información X
PortadaForo AyudaTutoriales
InicioForosForo Programación

Problema con archivos de acceso directo

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');
}

Página:1

Respuestas relacionadas:

Problema acceso directoProblema acceso directoForo
Problema con acceso directoProblema con acceso directoForo
Problema con acceso directoProblema con acceso directoForo
Problema con acceso directoProblema con acceso directoForo
Problema con el acceso directo.Problema con el acceso directo.Foro
Problema con acceso directoProblema con acceso directoForo
Problema con acceso directoProblema con acceso directoForo
Problema con acceso directoProblema con acceso directoForo
Problema con un acceso directoProblema con un acceso directoForo
Problema con acceso directoProblema con acceso directoForo
InicioSecciones
^ SubirAviso legal
Política Privacidad
Configurarequipos23 Diciembre 2024