Autor
|
Tema: [Ayuda] Eliminar entradas en un binario (Leído 2,890 veces)
|
nolosabe
Desconectado
Mensajes: 20
|
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"); while (salir!='s'){ clrscr(); textcolor(2); 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)"); clrscr(); break; default:printf("\n opcion incorrecta"); 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"); 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"); 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"); } 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"); 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=' '; if(opc=='s'){ clrscr(); printf("\n\n ingrese un sinonimo: "); opc=' '; clrscr(); printf("\n\n ¨Desea ingresar otro sinonimo? (s/n)"); if(opc=='s'){ clrscr(); printf("\n\n ingrese otro sinonimo: "); opc=' '; clrscr(); printf("\n\n ¨Desea ingresar otro sinonimo? (s/n)"); if(opc=='s'){ clrscr(); printf("\n ingrese otro sinonimo: "); opc='n'; }//if3 }//if2 }//if1 clrscr(); printf("\n Ingrese un antonimo: "); printf("\n ¨Desea ingresar un paronimo? (s/n) "); if(opc=='s'){ printf("\n Ingrese un paronimo: "); } clrscr(); 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)"); if(confirmar!='s'){ printf("\n\n --------\n\n Los datos no se escribieron en el archivo"); }//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 }//if }//else }//primer if }//if encontrado if(encontrado==1){ clrscr(); printf("\n\n LA PALABRA YA EXISTE EN EL DICCIONARIO"); }//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"); }//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 ); ok=1; }//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: "); while(encontrado ==0 && !feof(archivo )){ fread(&aux ,sizeof(struct dato ),1,archivo ); if(strcmp(palabra ,aux. palabra)==0){ ++encontrado; }//strcmp }//while 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("\n0) Volver al menu principal\n"); switch(opc){ case '1':printf("\n\n Palabra: %s \n Sinonimos: %s %s %s\n ",aux. palabra,aux. sinonimo1,aux. sinonimo2,aux. sinonimo3); break; case '2':printf("\n\n Palabra: %s \n Antonimo: %s\n",aux. palabra,aux. antonimo); break; case '3':printf("\n\n Palabra: %s \n Paronimo: %s",aux. palabra,aux. paronimo); 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); break; case '0': break; default:printf("\n OPCION INCORRECTA"); break; }//switch }//if encontrado else{ printf("\n\n LA PALABRA NO EXISTE EN EL DICCIONARIO"); }//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); gotoxy(30,2); printf("------------------------------------------------|"); gotoxy(1,5); 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"); cont=0; clrscr(); gotoxy(3,2); gotoxy(30,2); printf("------------------------------------------------|"); gotoxy(1,5); } } } } } } 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); gotoxy(30,2); 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"); cont=0; clrscr(); gotoxy(3,2); gotoxy(30,2); printf("------------------------------------------------|"); gotoxy(1,5); } } } } } } 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 ); ok=1; } 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: "); 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){ 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); gotoxy(2,17); gotoxy(2,18); printf("3) Segundo sinonimo"); gotoxy(2,19); gotoxy(2,20); gotoxy(2,21); gotoxy(2,22); printf("9) Salir sin guardar"); gotoxy(2,23); gotoxy(2,25); while(opc!='s'){ switch(select){ case'1':gotoxy(14,2); gotoxy(14,2); scanf("%s",&aux. palabra); gotoxy(11,25); break; case'2':gotoxy(14,4); gotoxy(14,4); memset(aux. sinonimo1,0x00,20); scanf("%s",&aux. sinonimo1); gotoxy(11,25); break; case'3':gotoxy(14,6); gotoxy(14,6); memset(aux. sinonimo2,0x00,20); scanf("%s",&aux. sinonimo2); gotoxy(11,25); break; case'4':gotoxy(14,8); gotoxy(14,8); memset(aux. sinonimo3,0x00,20); scanf("%s",&aux. sinonimo3); gotoxy(11,25); break; case'5':gotoxy(14,10); gotoxy(14,10); scanf("%s",&aux. antonimo); gotoxy(11,25); break; case'6':gotoxy(14,12); gotoxy(14,12); scanf("%s",&aux. paronimo); gotoxy(11,25); 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 ); clrscr(); gotoxy(15,12); printf("PALABRA MODIFICADA Y GUARDADA CORRECTAMENTE"); opc='s'; break; default:gotoxy(11,25); gotoxy(11,25); gotoxy(11,25); 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 ); ok=1; } if(ok==1){ memset(&aux ,0x00,sizeof(struct dato )); archivo =fopen(DICCIONARIO ,"rb"); if(archivo!=NULL){ gotoxy(20,2); printf("ELIMINAR PALABRAS\n"); printf("\n Ingrese la palabra a eliminar: "); 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 ); 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 ); } } } }//if ok }//void
|
|
|
En línea
|
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
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 ); { fseek(archivo , 0, SEEK_SET ); memset(&aux , 0x00, sizeof(struct dato )); printf("ELIMINAR PALABRAS\n"); printf("\n Ingrese la palabra a eliminar: "); 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); 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 ); { fread(&aux , sizeof(struct dato ), 1, archivo ); fwrite(&aux , sizeof(struct dato ), 1, fic_aux ); } } } } else printf("\n No se encontro la palabra ingresada\n"); } else printf("\nEl fichero esta vacio\n"); rename("Auxiliar.bin", DICCIONARIO ); } else printf("No se pudo abrir al fichero"); }//void
Saludos
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
nolosabe
Desconectado
Mensajes: 20
|
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
|
|
|
En línea
|
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas
|
|
|
nolosabe
Desconectado
Mensajes: 20
|
El unico error que encontre es que ingresa 2 veces la ultima palabra del diccionario, estoy tratando de arreglarlo, gracias
|
|
|
En línea
|
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas
|
|
|
nolosabe
Desconectado
Mensajes: 20
|
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](https://foro.elhacker.net/Smileys/navidad/cheesy.gif) gracias, me ha sido de mucha ayuda para hacer mim propio codigo... se que esto son cosas sencillas pero por algo se empieza ![:D](https://foro.elhacker.net/Smileys/navidad/cheesy.gif)
|
|
|
En línea
|
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[ code=C++] Conversor binario-decimal-binario
« 1 2 »
Programación C/C++
|
Chonk
|
11
|
24,458
|
9 Julio 2010, 17:52 pm
por Debci
|
|
|
eliminar ancestros de hojas arbol binario c++
Programación C/C++
|
Lain SEL
|
2
|
7,118
|
18 Agosto 2010, 04:05 am
por Lain SEL
|
|
|
Eliminar nodo en un arbol binario
.NET (C#, VB.NET, ASP)
|
DaNuK
|
4
|
29,384
|
6 Diciembre 2010, 20:19 pm
por DaNuK
|
|
|
Eliminar duplicados fichero binario
Programación C/C++
|
andrewmetal93
|
1
|
2,346
|
9 Mayo 2012, 19:23 pm
por andrewmetal93
|
|
|
Ayuda!!! XNOR de 4 entradas con puertas NOR
Electrónica
|
mathias_vg
|
5
|
3,646
|
9 Mayo 2014, 01:26 am
por adrianmendezRap
|
|