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
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
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
El unico error que encontre es que ingresa 2 veces la ultima palabra del diccionario, estoy tratando de arreglarlo, gracias
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