problemas al borrar un elemento en el archivo

Iniciado por geshiro, 26 Junio 2016, 19:56 PM

0 Miembros y 1 Visitante están viendo este tema.

geshiro

en mi funcion eleminar  tengo una validacion como esta if(inventario.cod == elim){ cual hize para borrar solo un elemento pero el problema que cuando intento borrar un elemento me borra todo los elementos del archivo y el de reporte no me muestra nada. no se que estoy haciendo mal


#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
FILE *file;
FILE *tmp;
struct inven{
  int cod;
  char descrip[30];
  int exist;
  int exist_min;
  int exist_max;
  float precio;
  int cod_provedor;
}inventario;

void crear();
void modificar();
void eliminar();
void reporte();
void menu();

void menu(){
int resp;
  do{

    printf("\n\t\t---------------------------------------------------");
    printf("\n\t\t\t      S T O R E L T E     ");
    printf("\n\t\t-------------------------------------------------\n\n\n\n");
    printf("\t\t\t\t [1] agregar producto  \n");
    printf("\t\t\t\t [2] modificar un producto     \n");
    printf("\t\t\t\t [3] eliminar             \n");
    printf("\t\t\t\t [4] reporte              \n");
    printf("\t\t\t\t [5] salir  ........        ");
    printf("\n\n\t\t\t\tSelecciona: ");
    resp=getchar();
    switch(resp){
      case '1': crear();
             break;

    case '2': modificar();
             break;

      case '3': eliminar();
            break;

      case '4': reporte();
            break;

      case '5' : exit(1);

      default:
         printf("opcion no validaa");
    }
  }
  while(resp!=6);
  getch();
}

int main(){
    menu();
    return 0;
}

void crear(){
   system("cls");
   int codigo = inventario.cod;
   char opcion = 's';
   if ((file=fopen("inventario.txt","a+"))==NULL)
      printf("\n\n\n\n\t\t< < < Error de apertura de archivo inventario.dat   > > >");
   else{
     while(opcion == 's'){
        printf("\n\n CODIGO: \t%d",codigo++);
        printf("\n\n PRODUCTO:\t ");
        scanf("%s",&inventario.descrip);
        printf("\n\n EXISTENCIA DEL PRODUCTO:\t ");
        scanf("%s", &inventario.exist);
        printf("\n\n PRECIO UNITARIO DEL PRODUCTO:\t ");
        scanf("%s",&inventario.precio);
        fwrite(&inventario, sizeof(inventario), 1, file);
        printf("\n\n\n\t\t DESEAS CAPTURAR OTRO PRODUCTO [s/n] : ");
          opcion = getchar();
        getch();
        }
    }
    fclose(file);
}

void modificar(){
      system("cls");
      int opc,i=0;
      char elim[6];
      printf("\nINGRESE EL CODIGO DEL PRODUCTO A MODIFICAR: ");
      scanf("%s",&elim);
      file = fopen("inventario.dat","r+b");   

        if(!file)
         printf("\n Error de apertura del archivo inventario.dat\n"); 
      else{
         while (((fread(&inventario, sizeof(inventario), 1, file))!=0)&&i!=1){
            //if(!strcmp(inventario.cod,elim)){       
            if(inventario.cod!=elim){
                printf("DESCRIPCION        : %s\n",inventario.descrip);
                printf("EXISTENCIA     : %s\n",inventario.exist);
                printf("PRECIO UNITARIO     :$ %s\n",inventario.precio);

               printf ("\nQUE DESEA MODIFICAR: ");
               printf ("\n\t\t\t1.-DESCRIPCION\n");
               printf("\t\t\t2.-EXISTENCIA\n");
               printf ("\t\t\t3.-PRECIO UNITARIO\n");
               printf("\t\t\t4.-SALIR\n");
               printf("\t\t\tDIGITA TU OPCION :");
               scanf("%d",&opc);
               switch (opc!=4){
                case 1:
                  printf ("\nINGRESA LA NUEVA DESCRIPCION: ");
                  scanf("%s",&inventario.descrip);
                  break;
                case 2:
                  printf ("\nINGRESA LA NUEVA EXISTENCIA ");
                  scanf("%s",&inventario.exist);
                  break;
                case 3:
                  printf ("\nINGRESA EL NUEVO PRECIO UNITARIO ");
                  scanf("%s",&inventario.precio);
                  break;
               }
             fseek(file,sizeof(inventario),SEEK_CUR);
             fwrite(&inventario,sizeof(inventario), 1, file);
             i=1;
             fclose(file);
            }
         }

      }
}

void eliminar(){
    system("cls");
    char elim[10];
    printf("\nINGRESE EL CODIGO DEL PRODUCTO PARA ELIMINAR: ");
    scanf("%s",&elim);
    file=fopen("inventario.dat","r+b");
    tmp=fopen("inventario1.dat","wb");
    if(!file)
        printf("\n Error de apuertura del archivo inventario.dat\n");
    else{
        while(((fread(&inventario, sizeof(inventario), 1, file))!=0)){
            if(inventario.cod == elim){
                //fseek(tmp,sizeof(inventario),SEEK_END);
                //fseek(tmp,sizeof(inventario),SEEK_CUR);
                fwrite(&inventario,sizeof(inventario), 1, tmp);
                fclose(tmp);
                tmp=fopen("inventario1.dat","r+b");
                printf ("\n\n\n\n\n\n\n\n\n\n\n                   EL PRODUCTO SE HA ELIMINADO CORRECTAMENTE \n");
                printf ("\n                          OPRIMA CUALQUIER TECLA PARA CONTINUAR");
                getch();
            }
        }
        fclose(file);
        fclose(tmp);
        system("del inventario.dat");
        system("ren inventario1.dat inventario.dat");
        }
    }

void reporte (){
system("cls");
int i;
FILE *invent; 
invent = fopen("inventario.dat", "r");   
if(invent == NULL)
     {
        printf("\nNo existe archivo"); 
     }
       fread(&inventario, sizeof(struct inven), 20, invent);
                             printf("------------------------------------------------------------------\n");
                            printf("CODIGO   DESCRIPCION\t\tEXISTENCIA\tPRECIO UNITARIO  \n");
                       printf("------------------------------------------------------------------\n");
while(!feof(invent)){
      printf("  %s      %s\t\t   %s\t\t      %s \n",inventario.cod,inventario.descrip,inventario.exist,inventario.precio);
       fread(&inventario, sizeof(struct inven), 20, invent);
       }
     fclose(invent);
    getch();
}

AlbertoBSD

No puedes usar esa compracion tu variable elim es cadena y tu variable .cod es entero no puedes comparar de esa forma. Tienes que pasar esa cadena a  entero con atoi.

De hi en mas no he visto todo el demas codigo.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geshiro

y si cambio la variable elim por int ahora si se podria?

AlbertoBSD

si es int si podrias hacer la comparacion correctamente.

Tendrias que cambiar el formato del scanf por

scanf("%d",&elim);  o en su defecto usar atoi sobre la cadena que ya capturaste.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geshiro


AlbertoBSD

#5
Hola no se de donde copiaste tu codigo pero al parecer no sabes lo que hace exactamente.

La linea del if esta mal, deberia de quedar mas o menos asi:

       while(((fread(&inventario, sizeof(inventario), 1, file))!=0)){
           if(inventario.cod != elim){
               fwrite(&inventario,sizeof(inventario), 1, tmp);
           }
       }
fclose(tmp);
printf ("\n\n\n\n\n\n\n\n\n\n\n                   EL PRODUCTO SE HA ELIMINADO CORRECTAMENTE \n");
               printf ("\n                          OPRIMA CUALQUIER TECLA PARA CONTINUAR");
               getch();



Asi mientras queden registros en el archivo original y mientras no sea igual al registro a eliminar se guardaran los registros leidos en el archivo temporal ya solo te quedara pasar el archivo temportal al archivo original. o solo seria cuestio  de renombrarlo

Saludos




Edito

Te dejo unos videos que he hecho sobre el tema.

[youtube=640,360]https://www.youtube.com/watch?v=6dHW5cnjVzw[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=RFgCRX68Nbk[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=DOqtEMW1Nqk[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geshiro

por ejemplo el de reporte porque no me funciona la funcion si esta haciendo el ciclo bien

AlbertoBSD

CitarAsi mientras queden registros en el archivo original y mientras no sea igual al registro a eliminar se guardaran los registros leidos en el archivo temporal ya solo te quedara pasar el archivo temportal al archivo original. o solo seria cuestio  de renombrarlo

Si te diste cuenta que ahora tienes 2 Archivos.
Hay que cambiarles el nombre.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geshiro

si pero inventario.dat deberia ya mostrarme los datos