[?] leer binario y guardar en struct dato AYUDA

Iniciado por nolosabe, 6 Octubre 2011, 22:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

nolosabe

.

Hola, disculpa la joda, pero estas funciones me dan bucle



void listarAnt()
{
    struct dato aux;
FILE *archivo;

    memset(&aux, 0x00, sizeof(struct dato));
    archivo = fopen(DICCIONARIO, "rb");
    if(archivo)
        {
        while(!feof(archivo))
            if(fread(&aux, sizeof(struct dato), 1, archivo))
                printf("Palabra: %s \nAntonimo: \n\t%s", aux.palabra, aux.antonimo);
        fclose(archivo);
        }
}


void listarPar()
{
    struct dato aux;
FILE *archivo;

    memset(&aux, 0x00, sizeof(struct dato));
    archivo = fopen(DICCIONARIO, "rb");
    if(archivo)
        {
        while(!feof(archivo))
            if(fread(&aux, sizeof(struct dato), 1, archivo))
                printf("Palabra: %s \nParonimo: \n\t%s", aux.palabra, aux.paronimo);
        fclose(archivo);
        }
}
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

rir3760

Si tienes un problema debes describirlo de una forma clara, si solo indicas "me dan bucle" no nos ayudas. Si para empezar los datos se guardaron correctamente entonces esas funciones no deben generar errores, si modificaste el programa entonces por favor publica el código fuente completo.

Ese par se puede reducir a:
void listarAnt()
{
   FILE *archivo;
   struct dato aux;
   
   if ((archivo = fopen (DICCIONARIO, "rb")) != NULL){
      while (fread (&aux, sizeof (struct dato), 1, archivo) == 1)
         printf ("Palabra: %s \nAntonimo: \n\t%s", aux.palabra, aux.antonimo);
      fclose (archivo);
   }
}


void listarPar()
{
   FILE *archivo;
   struct dato aux;
   
   if ((archivo = fopen (DICCIONARIO, "rb")) != NULL){
      while (fread (&aux, sizeof (struct dato), 1, archivo) == 1)
         printf ("Palabra: %s \nParonimo: \n\t%s", aux.palabra, aux.paronimo);
      fclose (archivo);
   }
}



Pero de nuevo lo que debes hacer es explicar en detalle el problema y presentar el código fuente modificado.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

nolosabe

#12
YA ENCONTRE EL ERROR, ESTABA EN EL SUB MENU DONDE SE LLAMABA A LA FUNCION... ACA SE LOS DEJO



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

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

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();                               //EL ERROR ES TODO ESTO QUE ESTA
while(salir!='s'){                  //AFUERA DEL WHILE, EL GETCH ESTA AFUERA
switch(opc){               //ENTONCES EL WHILE NO PARA PARA PEDIR SI QUIERES SALIR

case '1': //listarAnt();
break;
case '2': //listarPar();
break;
case '3': //listarTodo();
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
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

nolosabe

Compañeros, tengo otra duda, supongamos que yo uso "fread(&aux,sizeof(struct dato),1,archivo);"

y quiero que imprima lo que queda guardado en cierto campo de "aux" si y solo si, ese campo no esta vacio...
como lo hago?
probe usando:
"if(aux.antonimo!=NULL){"
"if(aux.antonimo!=""){"
"if(aux.antonimo!="\0"){"
"if(aux.antonimo!="            "){"

Y ninguna de esas maneras me funciono... alguna sugerencia

recuerden que estoy leyendo desde un binario, lo guardo en struct dato aux y despues lo controlo de ahi

GRACIAS  ;D
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

El_Java

#14
prueba poniendo algo como:
Código (cpp) [Seleccionar]
if(aux.antonimo);
//o tambien
if(aux.antonimo[0] != '\0');

Un saludo.

rir3760

En C no puedes comparar directamente dos cadenas. Como ya te indico El_Java debes verificar si el primer caracter de la cadena es diferente de '\0', solo si es asi la imprimes:
if (aux.antonimo[0] != '\0'){
   /* La cadena no esta vacia, la imprimes */
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

nolosabe

Muchas gracias a los 2!
funciono:
if(aux.antonimo[0] != '\0');
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas

nolosabe

Usando el codigo que me dieron en la primer respuesta, quiero hacer una funcion para eliminar palabras que no sea del estilo que esta en ese codigo, sino que sea algo asi:

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



pero la verdad intente varias cosas y no me funciona bien, alguien me puede dar una mano por favor?
Gracias a todos por su ayuda, espero yo también ser de ayuda para alguien mas