<div dir="ltr">Hola Hl3,<div class="gmail_extra"><br></div><div class="gmail_extra">Creo que sería de ayuda saber la definición de 'struct miembro' y si coincide exactamente con el formato del fichero, "fichas.dat". De todas maneras, existen algunos matices en tu código a destacar:</div><div class="gmail_extra"><br></div><div class="gmail_extra">- Si vas a usar un puntero que apunte a otras cadenas, no sugiero apuntar a una cadena literal. En su lugar, usa un array para definir tal cadena literal y haz que 'lista' apunte a ella inicialmente. Por ejemplo,</div><div class="gmail_extra"><br></div><div class="gmail_extra">char szMensajePorDefecto[] = "No encuentro esa persona";</div><div class="gmail_extra">char *lista = szMensajePorDefecto;</div><div class="gmail_extra">...</div><div class="gmail_extra"><br></div><div class="gmail_extra">Sin embargo, en este caso, como quieres "retornar la cadena", esto será un problema al retornar de la llamada de 'hijos()'. Deberías pasar el array resultante por parámetro para obligar a que exista fuera de la función; por ejemplo,</div><div class="gmail_extra"><br></div><div class="gmail_extra">char *hijos( int x, char szResultado[] )<br>{</div><div class="gmail_extra">  char *lista = szResultado;<br></div><div class="gmail_extra"><div class="gmail_extra">  ...<br></div><div class="gmail_extra">  return lista;</div><div class="gmail_extra">}</div><div><br></div></div><div class="gmail_extra">- Invocas 'feof()' antes de realizar la lectura; esto es una equivocación. Debes realizar la lectura y luego invocar 'feof()'. Esto es porque 'feof()' NO comprueba el final del fichero, sino que comprueba si el bit de fin-de-fichero (EOF) está habilitado. La función 'fread()' intentará leer del fichero y si encuentra el final del fichero, entonces habilitará ese bit de EOF. Esto es,</div><div class="gmail_extra"><br>fread( &ente, sizeof(struct miembro), 1, fp );<br></div><div class="gmail_extra"><div class="gmail_extra">while( !feof(fp) )</div><div class="gmail_extra">{</div><div class="gmail_extra">  ...<br></div><div class="gmail_extra">  fread( &ente, sizeof(struct miembro), 1, fp );</div><div>}</div></div><div class="gmail_extra"><br></div><div class="gmail_extra">- Si 'ente.nombre' es un array, entonces 'lista' no necesita estar apuntando a la cadena en el bucle, ya que no va a apuntar a otra cosa que no sea esa misma dirección de memoria. El contenido de 'ente.nombre' puede cambiar, pero no su dirección de memoria. Por lo tanto, puedes realizar la asignación una sola vez antes del bucle. Entiendo que quieras agregar ese mensaje, pero sinceramente aconsejo retornar un puntero nulo si el algoritmo no pudo encontrar un registro candidato.</div><div class="gmail_extra"><br></div><div class="gmail_extra">- Es posible que tengas un error en la lectura. Como desconocemos la definición de 'struct miembro', no sabemos el tipo del campo, 'nombre'. Si tal campo es un array, entonces posiblemente no haya ningún problema, pero si se trata de un puntero, entonces he ahí el problema. Necesitas un array o bien estático o bien dinámico.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Espero que esto te oriente.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Steven</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-01-11 15:04 GMT-05:00 Hl3 <span dir="ltr"><<a href="mailto:halowin3@gmail.com" target="_blank">halowin3@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">En este código:<br>
<br>
char *hijos(int x){<br>
        char *lista="No encuentro esa persona";<br>
        FILE *fp;<br>
        struct miembro ente;<br>
<br>
        //abro el fichas.dat<br>
        if( (fp=fopen("fichas.dat","rb"))==NULL){<br>
                puts("No puedo abrir FICHAS.DAT");<br>
                exit(1);<br>
        }<br>
        //busco hijos de x<br>
        while(!feof(fp)){<br>
                fread(&ente,sizeof(struct miembro),1,fp);<br>
                if( (ente.idp == x) || (ente.idm == x) ){<br>
                        lista = ente.nombre;<br>
                        printf("ente.nombre: %s   lista: %s\n", ente.nombre,lista );//ok<br>
                }<br>
        }<br>
        close(fp);<br>
        printf("Envio lista = %s\n",lista );<br>
        return lista;<br>
}<br>
<br>
<br>
<br>
El valor de "lista" dentro del bucle "while" es correcto, pero el valor que pinta en el printf que hay despues del "close(fp)" no tiene nada que ver con el valor real.<br>
<br>
!!!!!   ?????    !!!!!!<br></blockquote><div><br></div></div></div></div>