Título: problemas al borrar un elemento en el archivo
Publicado por: geshiro en 26 Junio 2016, 19:56 pm
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: "); switch(resp){ case '1': crear(); break; case '2': modificar(); break; case '3': eliminar(); break; case '4': reporte(); break; default: } } while(resp!=6); } int main(){ menu(); return 0; } void crear(){ 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 ++); 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] : "); } } } void modificar(){ int opc,i=0; char elim[6]; printf("\nINGRESE EL CODIGO DEL PRODUCTO A MODIFICAR: "); 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\tDIGITA TU OPCION :"); 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; } } } } void eliminar(){ char elim[10]; printf("\nINGRESE EL CODIGO DEL PRODUCTO PARA ELIMINAR: "); 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 ); 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"); } } system("ren inventario1.dat inventario.dat"); } } void reporte (){ 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"); 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 ); } }
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: AlbertoBSD en 26 Junio 2016, 20:24 pm
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
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: geshiro en 27 Junio 2016, 06:18 am
y si cambio la variable elim por int ahora si se podria?
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: AlbertoBSD en 27 Junio 2016, 06:28 am
si es int si podrias hacer la comparacion correctamente. Tendrias que cambiar el formato del scanf por
o en su defecto usar atoi sobre la cadena que ya capturaste. Saludos
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: geshiro en 27 Junio 2016, 06:39 am
pero ni hace igual me borra todo
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: AlbertoBSD en 27 Junio 2016, 14:52 pm
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 ); } } 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");
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. 6dHW5cnjVzw RFgCRX68Nbk DOqtEMW1Nqk
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: geshiro en 30 Junio 2016, 00:00 am
por ejemplo el de reporte porque no me funciona la funcion si esta haciendo el ciclo bien
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: AlbertoBSD en 30 Junio 2016, 01:25 am
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 Si te diste cuenta que ahora tienes 2 Archivos. Hay que cambiarles el nombre. Saludos
Título: Re: problemas al borrar un elemento en el archivo
Publicado por: geshiro en 30 Junio 2016, 02:24 am
si pero inventario.dat deberia ya mostrarme los datos
|