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();
}
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
y si cambio la variable elim por int ahora si se podria?
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
pero ni hace igual me borra todo
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]
por ejemplo el de reporte porque no me funciona la funcion si esta haciendo el ciclo bien
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
si pero inventario.dat deberia ya mostrarme los datos