[Ayuda] Eliminar entradas en un binario

Iniciado por nolosabe, 30 Octubre 2011, 17:59 PM

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

nolosabe

Hola, que tal, yo de nuevo molestando, tengo un problema con un progrmita que tengo. tengo este codigo fuente que voy a poner a continucion, pero no me funciona bien la funcion "baja()" si me pueden ayudar estaria muy agradecido


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


void alta();
void baja();
void modificar();
void listarAnt();
void listarPar();
//void listarTodo();
void consultar();
void subMenu();
int total();


#define DICCIONARIO "diccio.bin"

struct dato{
char palabra[20];
char sinonimo1[20],sinonimo2[20],sinonimo3[20];
char antonimo[20];
char paronimo[20];
}diccionario;

FILE *archivo = NULL;

void main(){
int opcion=0;
char salir='n';
FILE*archivo;
textbackground(0);
archivo=fopen(DICCIONARIO,"ab");
fclose(archivo);

while (salir!='s'){
clrscr();
textcolor(2);
printf("\n   DICCIONARIO \n");
printf("1) Ingresar \n");
printf("2) Eliminar \n");
printf("3) Modificar \n");
printf("4) Consultar \n");
printf("5) Listar \n");
printf("0) Salir \n");
opcion=getch();
switch(opcion){
case '1': alta();
break;
case '2': baja();
break;
case '3': modificar();
break;
case '4': consultar();
break;
case '5': subMenu();
break;
case '0': printf("\n ¨Esta seguro que desea salir? (s/n)");
salir=tolower(getch());
clrscr();
break;
default:printf("\n opcion incorrecta");
getch();
clrscr();
break;
}//fin switch
}//fin while
}//fin void main



void subMenu(){
clrscr();
int opc;
char salir='n';

archivo=fopen(DICCIONARIO,"rb");
if(archivo){

while(salir!='s'){
clrscr();
printf("\n Listar Palabras existentes \n");

printf("\n1) Listar antonimos");
printf("\n2) Listar paronimos");
printf("\n3) Listar: sinonimos, antonimos y paronimos");
printf("\n0) Volver al menu principal\n");

opc=getch();
clrscr();
switch(opc){

case '1': listarAnt();
break;
case '2': listarPar();
break;
case '3': //listarTodo();
//salir='s';
break;
case '0': salir='s';
break;
default:printf("\n OPCION INCORRECTA");
getch();
break;
}//Fin switch submenu
}//fin while
}//fin if
else{
printf("\n OCURRIO UN ERROR AL ABRIR EL ARCHIVO");
}//fin else
}//fin subMenu


int total(){
clrscr();
int total;
FILE*archivo;
archivo=fopen(DICCIONARIO,"rb");//abro el archivo diccionario.bin como solo lectura
if(archivo==NULL){
printf("\n Error al abrir el archivo");
fclose(archivo);
}
else{
fseek(archivo,0,SEEK_END);
total=ftell(archivo) / sizeof(struct dato);//divido el tama¤o del archivo entre el tama¤o de la estructura para saber cuantas hay
}
return total;//devuelvo el valor de la variable total(int)
}

void alta(){
struct dato aux,aux2;
char opc=' ',confirmar=' ';
int encontrado=0,error=0;

clrscr();
memset(&aux,0x00,sizeof(struct dato));
printf("\n Ingresar palabra \n");
printf("\n Palabra: ");
memset(&aux.palabra,0x00,20);
gets(aux.palabra);
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
while(encontrado==0 && !feof(archivo)){
if(aux.palabra[0]!='\0'){
fread(&aux2,sizeof(struct dato),1,archivo);
if(strcmp(aux.palabra,aux2.palabra)==0){
++encontrado;
}
}else{
error=1;
encontrado=99;
}
}//while
clrscr();
if(encontrado==0){
printf("\n ¨Desea ingresar un sinonimo? (s/n)");
opc=' ';

opc=tolower(getch());
if(opc=='s'){
clrscr();
printf("\n\n ingrese un sinonimo: ");
gets(aux.sinonimo1);
opc=' ';
clrscr();
printf("\n\n ¨Desea ingresar otro sinonimo? (s/n)");
opc=tolower(getch());
if(opc=='s'){
clrscr();
printf("\n\n ingrese otro sinonimo: ");
gets(aux.sinonimo2);
opc=' ';
clrscr();
printf("\n\n ¨Desea ingresar otro sinonimo? (s/n)");
opc=tolower(getch());
if(opc=='s'){
clrscr();
printf("\n ingrese otro sinonimo: ");
gets(aux.sinonimo3);
opc='n';
}//if3

}//if2

}//if1



clrscr();
printf("\n Ingrese un antonimo: ");
gets(aux.antonimo);
printf("\n ¨Desea ingresar un paronimo? (s/n) ");
opc=getch();
if(opc=='s'){
printf("\n Ingrese un paronimo: ");
gets(aux.paronimo);
}
clrscr();
printf(" Usted ingreso\n");
printf("\n\n Palabra: %s \n Sinonimos: %s %s %s\n Antonimo: %s\n Paronimo: %s",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3,aux.antonimo,aux.paronimo);
printf("\n\n Esta seguro que desea agregar estos datos al diccionario(s/n)");
confirmar=tolower(getch());
if(confirmar!='s'){
printf("\n\n --------\n\n Los datos no se escribieron en el archivo");
getch();
}//IF
else{
if(confirmar=='s'){
archivo=fopen(DICCIONARIO,"ab");
strlwr(aux.palabra);strlwr(aux.sinonimo1);
strlwr(aux.sinonimo2);strlwr(aux.sinonimo3);
strlwr(aux.antonimo);strlwr(aux.paronimo);
fwrite(&aux,sizeof(struct dato),1,archivo);

/*a continuacion lo que se hace es, que si
existen sinonimos, estos se ingresen como palabra,
la que era la palabra y los otros sinonimos
se le ingresen como sinonimo, y el antonimo y paronimo
se le ingresen tambien */

if(aux.sinonimo1[0]!='\0'){
memset(&aux2,0x00,sizeof(struct dato));
strcpy(aux2.sinonimo1,aux.palabra);
strcpy(aux2.palabra,aux.sinonimo1);
strcpy(aux2.sinonimo2,aux.sinonimo2);
strcpy(aux2.sinonimo3,aux.sinonimo3);
strcpy(aux2.antonimo,aux.antonimo);
fwrite(&aux2,sizeof(struct dato),1,archivo);
}//if aux sinonimo1
if(aux.sinonimo2[0]!='\0'){
memset(&aux2,0x00,sizeof(struct dato));
strcpy(aux2.sinonimo2,aux.palabra);
strcpy(aux2.palabra,aux.sinonimo2);
strcpy(aux2.sinonimo1,aux.sinonimo1);
strcpy(aux2.sinonimo3,aux.sinonimo3);
strcpy(aux2.antonimo,aux.antonimo);
fwrite(&aux2,sizeof(struct dato),1,archivo);
}//if aux sinonimo2
if(aux.sinonimo3[0]!='\0'){
memset(&aux2,0x00,sizeof(struct dato));
strcpy(aux2.sinonimo3,aux.palabra);
strcpy(aux2.palabra,aux.sinonimo3);
strcpy(aux2.sinonimo2,aux.sinonimo2);
strcpy(aux2.sinonimo1,aux.sinonimo1);
strcpy(aux2.antonimo,aux.antonimo);
fwrite(&aux2,sizeof(struct dato),1,archivo);
}//if aux sinonimo2
fclose(archivo);
}//if
}//else
}//primer if


}//if encontrado
if(encontrado==1){
clrscr();
printf("\n\n  LA PALABRA YA EXISTE EN EL DICCIONARIO");
getch();
}//encontrado = 1
if(error==1){
clrscr();
printf("\n\n  Error, no ingreso ninguna palabra");
gotoxy(2,8);
printf("\n\n  Presione cualquier tecla para volver al menu principal\n");
getch();
}//error = 1
}//funcion



void consultar(){
struct dato aux;
char palabra[20];
int encontrado=0,ok=0,opc=0;
FILE*archivo;

archivo=fopen(DICCIONARIO,"rb");
if(archivo){
fseek(archivo,0,SEEK_END);
if(ftell(archivo)!=0)
ok=1;
fclose(archivo);
}//if archivo
if(ok==1){
memset(&aux,0x00,sizeof(struct dato));
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
printf("\n Ingrese la palabra a consultar: ");
memset(&palabra,0x00,20);
scanf("%s",&palabra);
while(encontrado==0 && !feof(archivo)){
fread(&aux,sizeof(struct dato),1,archivo);
if(strcmp(palabra,aux.palabra)==0){
++encontrado;
}//strcmp
}//while
fclose(archivo);
if(encontrado!=0){
clrscr();
printf("\n ¨Que desea consultar? \n");
printf("\n1) Mostrar todos los sinonimos");
printf("\n2) Mostrar el antonimo");
printf("\n3) Mosrar el paronimo");
printf("\n4) Mostrar todo");
printf("\n0) Volver al menu principal\n");
opc=getch();
switch(opc){
case '1':printf("\n\n Palabra: %s \n Sinonimos: %s %s %s\n ",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3);
getch();
break;
case '2':printf("\n\n Palabra: %s \n Antonimo: %s\n",aux.palabra,aux.antonimo);
getch();
break;
case '3':printf("\n\n Palabra: %s \n Paronimo: %s",aux.palabra,aux.paronimo);
getch();
break;
case '4':printf("\n\n Palabra: %s \n Sinonimos: %s %s %s\n Antonimo: %s\n Paronimo: %s",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3,aux.antonimo,aux.paronimo);
getch();
break;

case '0': break;
default:printf("\n OPCION INCORRECTA");
getch();
break;

}//switch
}//if encontrado
else{
printf("\n\n LA PALABRA NO EXISTE EN EL DICCIONARIO");
getch();
}//else
}//if archivo!=NULL
else printf("\n ERROR AL ABRIR EL ARCHIVO");

}// if ok=1
else printf("\n ERROR AL ABRIR EL ARCHIVO");


}

void listarAnt(){
struct dato aux;
int cont=0;
FILE *archivo;

memset(&aux,0x00,sizeof(struct dato));
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
fseek(archivo,0,SEEK_SET);
gotoxy(3,2);
printf("P A L A B R A      |");
gotoxy(30,2);
printf("A N T O N I M O\n");
printf("------------------------------------------------|");
gotoxy(1,5);
while(!feof(archivo)){
if(fread(&aux,sizeof(struct dato),1,archivo)){
if(aux.antonimo[0]!='\0'){
printf("\n %15s     |  %15s \n",aux.palabra,aux.antonimo);
printf("------------------------------------------------|");
cont++;
if(cont==7){
printf("\n Presione una tecla para continuar el listado");
getch();
cont=0;
clrscr();
gotoxy(3,2);
printf("P A L A B R A      |");
gotoxy(30,2);
printf("A N T O N I M O\n");
printf("------------------------------------------------|");
gotoxy(1,5);
}
}
}
}
fclose(archivo);
getch();
}
}

void listarPar(){
struct dato aux;
int cont=0,salir=1;
FILE *archivo;

memset(&aux,0x00,sizeof(struct dato));
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
fseek(archivo,0,SEEK_SET);
gotoxy(3,2);
printf("P A L A B R A      |");
gotoxy(30,2);
printf("P A R O N I M O\n");
printf("------------------------------------------------|");
gotoxy(1,5);
salir=1;
while(!feof(archivo) && salir==1){
if(fread(&aux,sizeof(struct dato),1,archivo)){
if(aux.paronimo[0]!='\0'){
printf("\n %15s     |  %15s \n",aux.palabra,aux.paronimo);
printf("------------------------------------------------|");
cont++;
if(cont==7){
printf("\n Presione una tecla para continuar el listado, o 0 (cero) para salir");
getch();
cont=0;
clrscr();
gotoxy(3,2);
printf("P A L A B R A      |");
gotoxy(30,2);
printf("P A R O N I M O\n");
printf("------------------------------------------------|");
gotoxy(1,5);
}
}
}
}
fclose(archivo);
getch();
}
}









void modificar(){
char opc='n';
struct dato aux;
FILE *archivo;
archivo=NULL;
char palabra[20];
int encontrado=0,ok=0,select=0,pos=0;
clrscr();
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
fseek(archivo,0,SEEK_END);
if(ftell(archivo)!=0)
ok=1;
fclose(archivo);
}
if(ok==1){
memset(&aux,0x00,sizeof(struct dato));
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
gotoxy(20,2);
printf("MODIFICAR PALABRAS\n");
printf("\n Ingrese la palabra a modificar: ");
scanf("%s",&palabra);
strlwr(palabra);
pos=0;
while(encontrado==0 && !feof(archivo)){
fread(&aux,sizeof(struct dato),1,archivo);
if(strcmp(palabra,aux.palabra)!=0)
pos++;
if(strcmp(palabra,aux.palabra)==0){
encontrado=1;
}//strcmp
}//while

if(encontrado==1){
fclose(archivo);
clrscr();
gotoxy(2,2);
printf("Palabra:    %s",aux.palabra);
gotoxy(2,4);
printf("Sinonimo 1: %s",aux.sinonimo1);
gotoxy(2,6);
printf("Sinonimo 2: %s",aux.sinonimo2);
gotoxy(2,8);
printf("Sinonimo 3: %s",aux.sinonimo3);
gotoxy(2,10);
printf("Antonimo:   %s",aux.antonimo);
gotoxy(2,12);
printf("Paronimo:   %s",aux.paronimo);
gotoxy(2,14);
printf("Ingrese un campo a modificar");
gotoxy(2,16);
printf("1) Palabra");
gotoxy(2,17);
printf("2) Primer sinonimo");
gotoxy(2,18);
printf("3) Segundo sinonimo");
gotoxy(2,19);
printf("4) Tercer sinonimo");
gotoxy(2,20);
printf("5) Antonimo");
gotoxy(2,21);
printf("6) Paronimo");
gotoxy(2,22);
printf("9) Salir sin guardar");
gotoxy(2,23);
printf("0) SALIR Y GUARDAR");
gotoxy(2,25);
printf("OPCION: ");
select=getch();
while(opc!='s'){
switch(select){
case'1':gotoxy(14,2);
printf("                            ");
gotoxy(14,2);
memset(aux.palabra,0x00,20);
scanf("%s",&aux.palabra);
gotoxy(11,25);
select=getch();
break;
case'2':gotoxy(14,4);
printf("                            ");
gotoxy(14,4);
memset(aux.sinonimo1,0x00,20);
scanf("%s",&aux.sinonimo1);
gotoxy(11,25);
select=getch();
break;
case'3':gotoxy(14,6);
printf("                            ");
gotoxy(14,6);
memset(aux.sinonimo2,0x00,20);
scanf("%s",&aux.sinonimo2);
gotoxy(11,25);
select=getch();
break;
case'4':gotoxy(14,8);
printf("                            ");
gotoxy(14,8);
memset(aux.sinonimo3,0x00,20);
scanf("%s",&aux.sinonimo3);
gotoxy(11,25);
select=getch();
break;
case'5':gotoxy(14,10);
printf("                            ");
gotoxy(14,10);
memset(aux.antonimo,0x00,20);
scanf("%s",&aux.antonimo);
gotoxy(11,25);
select=getch();
break;
case'6':gotoxy(14,12);
printf("                            ");
gotoxy(14,12);
memset(aux.paronimo,0x00,20);
scanf("%s",&aux.paronimo);
gotoxy(11,25);
select=getch();
break;
case'9':opc='s';
break;
case'0':strlwr(aux.palabra);strlwr(aux.sinonimo1);
strlwr(aux.sinonimo2);strlwr(aux.sinonimo3);
strlwr(aux.antonimo);strlwr(aux.paronimo);
archivo = fopen(DICCIONARIO, "rb+");
fseek(archivo,sizeof(struct dato)*pos,SEEK_SET);
fwrite(&aux,sizeof(struct dato),1,archivo);
fclose(archivo);
clrscr();
gotoxy(15,12);
printf("PALABRA MODIFICADA Y GUARDADA CORRECTAMENTE");
opc='s';
getch();
break;

default:gotoxy(11,25);
printf("opcion incorrecta");
getch();
gotoxy(11,25);
printf("                 ");
gotoxy(11,25);
select=getch();
break;
}//switch
}//while
}//if encontrado
}//if!=null

}//if ok
}




void baja(){
int encontrado=0,ok=0,posicion=0;
struct dato aux;
char palabra[20],opc='n';
FILE *archivo;
clrscr();
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
fseek(archivo,0,SEEK_END);
if(ftell(archivo)!=0)
ok=1;
fclose(archivo);
}
if(ok==1){
memset(&aux,0x00,sizeof(struct dato));
memset(&palabra,0x00,20);
archivo=fopen(DICCIONARIO,"rb");
if(archivo!=NULL){
gotoxy(20,2);
printf("ELIMINAR PALABRAS\n");
printf("\n Ingrese la palabra a eliminar: ");
scanf("%s",&palabra);
strlwr(palabra);
while(encontrado==0 && !feof(archivo)){
fread(&aux,sizeof(struct dato),1,archivo);
if(strcmp(palabra,aux.palabra)==0){
encontrado=1;
}//strcmp
}//while
clrscr();
if(encontrado==1){
printf("\n Esta seguro que desea eliminar \n la siguiente entrada del diccionario (s/n)\n");
printf("\n Palabra: %s \n Sinonimos: %s %s %s\n Antonimo: %s\n Paronimo: %s\n",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3,aux.antonimo,aux.paronimo);
}
else{
printf("\n No se encontro la palabra ingresada\n");
}
fseek(archivo,0,SEEK_END);
posicion=ftell(archivo);
fclose(archivo);
opc=getch();
if(opc=='s' || opc=='S'){
archivo=fopen(DICCIONARIO,"rb+");
      // fseek(archivo,0,SEEK_SET);
while(ftell(archivo)<=posicion){
fread(&aux,sizeof(struct dato),1,archivo);
fseek(archivo,sizeof(struct dato)*(-2),SEEK_CUR);
fwrite(&aux,sizeof(struct dato),1,archivo);
fseek(archivo,sizeof(struct dato),SEEK_CUR);

}
fclose(archivo);
}
}
}//if ok
}//void
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

satu

Hola

Tienes algunos errores de concepto, para borrar un registro de un fichero tienes que guardar los válidos en otro fichero y luego cambias el nombre del nuevo fichero.

Te pongo el código, aunque no lo he probado (paso de los errores por culpa de conio)

void baja()
{
    int encontrado=0, ok=0, posicion=0;
    struct dato aux;
    char palabra[20], opc='n';
    FILE *fic_aux;

    archivo = fopen(DICCIONARIO,"r+b");
    if(archivo != NULL)
        {
        fseek(archivo, 0, SEEK_END);
        if(ftell(archivo) != 0)
            {
            fseek(archivo, 0, SEEK_SET);
            memset(&aux, 0x00, sizeof(struct dato));
            memset(&palabra, 0x00, 20);

            printf("ELIMINAR PALABRAS\n");
            printf("\n Ingrese la palabra a eliminar: ");
            gets(palabra);
            strlwr(palabra);
            while(encontrado==0 && !feof(archivo))
                {
                fread(&aux, sizeof(struct dato), 1, archivo);
                if(strcmp(palabra, aux.palabra) == 0)
                    encontrado=1;
                }//while

            if(encontrado == 1)
                {
                printf("\n Esta seguro que desea eliminar la entrada del diccionario (s/n)\n");
                printf("\n Palabra: %s \n Sinonimos: %s %s %s\n Antonimo: %s\n Paronimo: %s\n",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3,aux.antonimo,aux.paronimo);
               
                scanf("%c", &opc);
                while(getchar()!='\n');

                if(opc=='s' || opc=='S')
                    {
                    fseek(archivo, -(sizeof(struct dato)), SEEK_CUR);
                    posicion = ftell(archivo);
                    fseek(archivo, 0, SEEK_SET);
                    fic_aux = fopen("Auxiliar.bin", "wb");
                    if(aux)
                        {
                        while(ftell(archivo) < posicion)
                            {
                            fread(&aux, sizeof(struct dato), 1, archivo);
                            fwrite(&aux, sizeof(struct dato), 1, fic_aux);
                            }
                        //Adelantamos una posición el cursor
                        fread(&aux, sizeof(struct dato), 1, archivo);
                        while(!feof(archivo))
                            {
                            fread(&aux, sizeof(struct dato), 1, archivo);
                            fwrite(&aux, sizeof(struct dato), 1, fic_aux);
                            }
                        fclose(aux);
                        }
                    }
                }
            else
                printf("\n No se encontro la palabra ingresada\n");
            }
        else
            printf("\nEl fichero esta vacio\n");

        fclose(archivo);

        remove(DICCIONARIO);
        rename("Auxiliar.bin", DICCIONARIO);
        }
    else
        printf("No se pudo abrir al fichero");
}//void


Saludos
Breakbeat como forma de vida

nolosabe

Hola, bueno, muchas gracias, ahora en cuanto pueda lo pruebo y si hay algun pequeño error se corrige rapido.
Pasa que no sabia que se podian tener 2 archivos abiertos al mismo tiempo, me habian dicho que no, y tampoco conocia la funcion rename.
gracias
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

nolosabe

El unico error que encontre es que ingresa 2 veces la ultima palabra del diccionario, estoy tratando de arreglarlo, gracias
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

nolosabe

Solucionado, modifique bastante el codigo, en la parte de escritura le puse un solo while y que escribiera en el otro archivo si y solo si "if(strcmp(palabra,aux.palabra)!=0)" entonces si por ejemplo quiero eliminar casa, y la palabra casa esta escrita 2 veces, la elimina las 2 veces que esta escrita y despues la condicion para que se cumpla el while es que una variable llamada posicion que se suma 1 cada vez que se ejecuta el fread, sea menor que la funcion total(); entonces no me da mas ese error que me repetia la ultima palabra

:D

gracias, me ha sido de mucha ayuda para hacer mim propio codigo...
se que esto son cosas sencillas pero por algo se empieza :D
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas