Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/06/2007, 12:33
neyboll
 
Fecha de Ingreso: junio-2007
Mensajes: 2
Antigüedad: 17 años, 7 meses
Puntos: 0
Pregunta Problema con busqueda en ficheros binarios en C

Hola buenas a todos estoy realizando un proyecto que gestiona el personal y las ventas de una empresa, y tengo un problema con la busqueda dentro de un fichero binario, os pongo la funcion en cuestion ya que el codigo entero es muy largo aunque si alguien lo pide lo posteare.

Tengo al personal en un fichero y las ventas en otro, la cuestion es que si borro un empleado debo borrar tambien todas las ventas que a realizado y no me funciona esa parte.

Si alguien me pudiera ayudar estaria muy agradecido


Estas son las estructuras, he intentado realiazar la tarea de borrar las ventas que ha realizado una persona, ambas coinciden por el campo NIF.
Para ello he recorido el fichero de ventas moviendo la posicion bloque a bloque con el tamaño de la estructura, comparando el NIF del la estructura ventas con NIF de la persona ha borrar. Y no me funciona.

Que esta mal en el codigo?
Código:
struct persona
{
    char nif[tam];
    char nombre[tam];
    char direccion[tam];
    char tf[tam];
    int puesto;
    float comision;
    int control_alta;
};
struct venta
{
    char nif[18];
    float cantidad;
    char fecha[10];
    int control_alta;
};
Código:
void bajaspersonal()
{
    FILE *canal;
    FILE *canal2;
    struct persona p;
    struct venta v;
    int num;

    while((canal=fopen("personal","r+b"))==NULL)
    {
        canal=fopen("personal","wb");
        fclose(canal);
    }
    while((canal2=fopen("ventas","r+b"))==NULL)
    {
        canal=fopen("ventas","wb");
        fclose(canal);
    }
    do
    {
        fflush(stdin);
        do
        {
            clrscr();
            gotoxy(21,7);
            printf("Introduce el numero de cliente:  ");
            scanf("%d",&num);
        }
        while(num<1||num>MAX);
        p.control_alta='0';
        fseek(canal,(num-1)*sizeof(struct persona),SEEK_SET);
        fread(&p,sizeof(struct persona),1,canal);
        if(p.control_alta!='1')
        {
            gotoxy(10,20);
            printf("Empleado no existente");
        }
        else
        {
            pantalla_datos();
            gotoxy(17,7);
            printf("%s",p.nif);
            gotoxy(17,9);
            printf("%s",p.nombre);
            gotoxy(17,11);
            printf("%s",p.direccion);
            gotoxy(17,13);
            printf("%s",p.tf);
            gotoxy(54,13);
            printf("%f",p.comision);
            gotoxy(25,18);
            printf("Puesto %s",puestos[p.puesto-1]);
            printf("\nSe borraran todas las ventas realizadas por este empleado");
            if(pregunte_s_n("\nConfirma la baja?(S/N):")=='S')
            {/*Borra las ventas y el empleado*/
                for(int i=0;i<=numven && !feof(canal2);i++) /* numven contiene el numero de ventas que se han realizado*/
                { //Mientras no llege al final del archivo y haya ventas
                    fseek(canal2,i*sizeof(struct venta),SEEK_SET);
                    fread(&v,sizeof(struct venta),1,canal2);
                    if(p.nif==v.nif)
                    {
                        v.control_alta='0'; // Borra la venta del empleado
                        fseek(canal2,(i-1)*sizeof(struct venta),SEEK_SET);
                        fwrite(&v,sizeof(struct venta),1,canal2);
                        numven-=num;
                    }
                }
                p.control_alta='0';//Borra el empleado
                fseek(canal,(num-1)*sizeof(struct persona),SEEK_SET);
                fwrite(&p,sizeof(struct persona),1,canal);
                numper=num-1;
            }
        }
    }
    while(pregunte_s_n("Mÿs bajas?(S/N):")=='S');
    menupersonal();
    fclose(canal);
    fclose(canal2);
}

Última edición por neyboll; 01/06/2007 a las 19:46