Hola
Tienes varios errores, leete
esto.
He visto el código en el otro post que tienes y he hecho el ejercicio en 15 minutos basándome en lo que tienes hecho, creo que funciona todo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DICCIONARIO "diccionario.bin"
void alta();
void baja();
void modificar();
void consultar();
void listarSin();
void listarAnt();
void listarPar();
void subMenu();
int total();
struct dato{
char palabra[20];
char sinonimo1[20], sinonimo2[20], sinonimo3[20];
char antonimo[20];
char paronimo[20];
};
int main(void)
{
int opcion=0;
char salir='n';
FILE *archivo;
archivo
= fopen(DICCIONARIO
, "rb"); if(!archivo)
archivo
= fopen(DICCIONARIO
, "wb");
while (salir!='s')
{
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("\nEsta seguro que desea salir? (s/n)\n"); break;
default:
printf("Opcion incorrecta\n\n"); break;
}//fin switch
}//fin while
return 0;
}//fin int main
void subMenu()
{
int opc, ok=0;
FILE *archivo;
char salir='n';
archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
fseek(archivo
, 0, SEEK_END
); ok = 1;
}
if(ok)
{
while(salir!='s')
{
printf("\n Listar Palabras existentes \n"); printf("\n1) Listar sinonimos"); printf("\n2) Listar antonimos"); printf("\n3) Listar paronimos"); printf("\n4) Listar: sinonimos, antonimos y paronimos"); printf("\n0) Volver al menu principal\n");
switch(opc)
{
case 1:
listarSin();
break;
case 2:
listarAnt();
break;
case 3:
listarPar();
break;
case 4:
listarSin();
listarAnt();
listarPar();
break;
case 0:
salir='s';
break;
default:
printf("\nOPCION INCORRECTA\n\n"); break;
}
}
}
else
printf("El diccionario esta vacio\n\n"); }//fin subMenu
int total()
{
int total = 0;
FILE *archivo;
archivo
=fopen(DICCIONARIO
, "rb");//abro el archivo diccionario.bin como solo lectura if(archivo==NULL)
printf("\nError al abrir el archivo %s\n\n", DICCIONARIO
); 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;
}
void alta()
{
char opc;
struct dato aux;
FILE *archivo;
memset(&aux
, 0x00, sizeof(struct dato
)); printf("\nIngresar palabra/s \n"); fgets(aux.
palabra, 20, stdin
);
printf("Ingresa un sinonimo: "); fgets(aux.
sinonimo1, 20, stdin
);
printf("Desea ingresar otro sinonimo? (s/n): "); if(opc=='s')
{
printf("Ingrese otro sinonimo: "); fgets(aux.
sinonimo2, 20, stdin
);
printf("Desea ingresar otro sinonimo? (s/n): "); if(opc=='s')
{
printf("Ingrese otro sinonimo: "); fgets(aux.
sinonimo3, 20, stdin
); }
}//if2
printf("Ingrese un antonimo: "); fgets(aux.
antonimo, 20, stdin
);
printf("Ingrese un paronimo: "); fgets(aux.
paronimo, 20, stdin
);
printf("Palabra: %s \nSinonimos:\n\t%s \n\t%s \n\t%s \nAntonimo:\n\t%s \nParonimo: \n\t%s", aux.
palabra, aux.
sinonimo1, aux.
sinonimo2, aux.
sinonimo3, aux.
antonimo, aux.
paronimo); do
{
printf("\n\nEsta seguro que desea agregar estos datos al diccionario(s/n): "); }
while(opc!='s' && opc!='n');
if(opc=='s')
{
archivo
=fopen(DICCIONARIO
, "a+b"); if(archivo)
{
fwrite(&aux
, sizeof(struct dato
), 1, archivo
); }
}//if
}//funcion
void baja()
{
char palabra[20];
FILE *archivo;
int ok = 0, i = 0, n = total();
struct dato aux, aux2[n];
archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
fseek(archivo
, 0, SEEK_END
); ok = 1;
}
if(ok)
{
memset(&aux
, 0x00, sizeof(struct dato
)); memset(&aux2
, 0x00, sizeof(aux2
));
printf("Ingresa la palabra a eliminar: "); fgets(palabra
, 20, stdin
); archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
if(fread(&aux
, sizeof(struct dato
), 1, archivo
)) if(strcmp(palabra
, aux.
palabra)!=0) {
strcpy(aux2
[i
].
palabra, aux.
palabra); strcpy(aux2
[i
].
sinonimo1, aux.
sinonimo1); strcpy(aux2
[i
].
sinonimo2, aux.
sinonimo2); strcpy(aux2
[i
].
sinonimo3, aux.
sinonimo3); strcpy(aux2
[i
].
antonimo, aux.
antonimo); strcpy(aux2
[i
].
paronimo, aux.
paronimo); i++;
}
if(i < n)
{
archivo
= fopen(DICCIONARIO
, "wb"); if(archivo)
{
for(i=0; i<n-1; i++)
fwrite(&aux2
[i
], sizeof(struct dato
), 1, archivo
); }
printf("Palabra eliminada con exito\n\n"); }
else
printf("No se encuentra la palaba en el diccionario\n\n"); }
}
else
printf("El diccionario no se encuentra o esta vacio\n\n"); }
void modificar()
{
char opc;
struct dato aux;
FILE *archivo;
char palabra[20];
int enc = 0, ok = 0;
archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
fseek(archivo
, 0, SEEK_END
); ok = 1;
}
if(ok)
{
memset(&aux
, 0x00, sizeof(struct dato
)); archivo
= fopen(DICCIONARIO
, "r+b"); if(archivo)
{
printf("Ingresa la palabra a modificar: "); fgets(palabra
, 20, stdin
);
while(!enc
&& !feof(archivo
)) {
fread(&aux
, sizeof(struct dato
), 1, archivo
); if(strcmp(palabra
, aux.
palabra)==0) enc = 1;
}
if(enc)
{
fseek(archivo
, sizeof(struct dato
)*(-1), SEEK_CUR
); printf("Introduce la nueva palabra: "); fgets(aux.
palabra, 20, stdin
); printf("Introduce un sinonimo: "); fgets(aux.
sinonimo1, 20, stdin
); do
{
printf("Quieres introducir otro sinonimo? (s/n)"); }
while(opc!='s' && opc!='n');
if(opc=='s')
{
printf("Introduce otro sinonimo: "); fgets(aux.
sinonimo2, 20, stdin
);
do
{
printf("Quieres introducir otro sinonimo? (s/n)"); }
while(opc!='s' && opc!='n');
if(opc=='s')
{
printf("Introduce otro sinonimo: "); fgets(aux.
sinonimo3, 20, stdin
); }
}
printf("Introduce un antonimo: "); fgets(aux.
antonimo, 20, stdin
); printf("Introduce un paronimo: "); fgets(aux.
paronimo, 20, stdin
);
fwrite(&aux
, sizeof(struct dato
), 1, archivo
); printf("Palabra modificada correctamente\n\n"); }
else
printf("No se ha encontrado la palabra: %s\n\n", palabra
); }
else
printf("No se puede abrir el diccionario\n\n"); }
else
printf("El diccionario no se encuentra o esta vacio\n\n"); }
void consultar()
{
struct dato aux;
FILE *archivo;
char palabra[20];
int enc = 0, ok = 0;
archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
fseek(archivo
, 0, SEEK_END
); ok = 1;
}
if(ok)
{
memset(&aux
, 0x00, sizeof(struct dato
)); archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
printf("Ingresa la palabra a consultar: "); fgets(palabra
, 20, stdin
);
while(!enc
&& !feof(archivo
)) {
fread(&aux
, sizeof(struct dato
), 1, archivo
); if(strcmp(palabra
, aux.
palabra)==0) enc = 1;
}
if(enc)
printf("Palabra: %s \nSinonimos: \n\t%s \n\t%s \n\t%s \nAntonimo: \n\t%s \nParonimo: \n\t%s", aux.
palabra, aux.
sinonimo1, aux.
sinonimo2, aux.
sinonimo3, aux.
antonimo, aux.
paronimo); else
printf("La palabra no se encuentra\n\n"); }
else
printf("El diccionario no se encuentra o esta vacio\n\n"); }
else
printf("El diccionario no se encuentra o esta vacio\n\n"); }
void listarSin()
{
struct dato aux;
FILE *archivo;
memset(&aux
, 0x00, sizeof(struct dato
)); archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
if(fread(&aux
, sizeof(struct dato
), 1, archivo
)) printf("Palabra: %s \nSinonimos: \n\t%s \n\t%s \n\t%s\n", aux.
palabra, aux.
sinonimo1, aux.
sinonimo2, aux.
sinonimo3); }
}
void listarAnt()
{
struct dato aux;
FILE *archivo;
memset(&aux
, 0x00, sizeof(struct dato
)); archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
if(fread(&aux
, sizeof(struct dato
), 1, archivo
)) printf("Palabra: %s \nAntonimo: \n\t%s", aux.
palabra, aux.
antonimo); }
}
void listarPar()
{
struct dato aux;
FILE *archivo;
memset(&aux
, 0x00, sizeof(struct dato
)); archivo
= fopen(DICCIONARIO
, "rb"); if(archivo)
{
if(fread(&aux
, sizeof(struct dato
), 1, archivo
)) printf("Palabra: %s \nParonimo: \n\t%s", aux.
palabra, aux.
paronimo); }
}
Si tienes alguna duda no dudes en preguntar.
Saludos