<div dir="ltr">Hola Hl3,<div class="gmail_extra"><br></div><div class="gmail_extra">Si vas a usar un array, entonces te advierto que tendrás que copiar la cadena de 'ente.nombre' a tal array usando 'strcpy()', aunque recomiendo usar 'memcpy()', en este caso.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Sospechaba que creaste el fichero usando 'struct miembro' al igual que lees el fichero usando la misma definición de 'struct miembro', pero obviamente tenía que indicarlo, por si no se daba este caso.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Recuerda que invocas 'printf()' bajo 'if'. Usando tu código fuente, posiblemente no veas diferencia en la práctica porque seguramente esa condición de 'if' no siempre es verdadera. Comprueba el caso eliminando 'if' para que veas el resultado de 'printf()' en el bucle. Deberías observar el comportamiento extraño que 'printf()' muestra los datos de la última lectura dos veces. Esto es porque no se activó el bit de EOF en la iteración previa, pero al intentar una lectura más allá del final del fichero, entonces sí se activa tal bit, y entonces la condición en 'while' es falsa, cuando 'feof()' lee tal bit.</div><div class="gmail_extra"><br></div><div class="gmail_extra">La explicación del caso de mostrar igual contenidos de 'lista' y de 'ente.nombre' en el bucle 'while' pero distintos fuera del bucle se basa en lo que menciono en el párrafo anterior al igual que la explicación en el correo-e anterior con el comportamiento de 'lista'. El problema es que no muestras los contenidos en el bucle 'while' (directamente), sino bajo la sentencia 'if', la cual queda comprendida en el bucle 'while'. Esto implica que sólo muestras ciertas cadenas y no todas las posibles cadenas leídas. Como además 'lista' es un puntero que apunta a 'ente.miembro', cualquier cambio del contenido en este array también se vería reflejado si usas 'lista', porque esta variable es un puntero. Es parecido a hacer esto:<br><br>char szCadena[100] = "hola";</div><div class="gmail_extra">char *ptr = szCadena;</div><div class="gmail_extra"><br></div><div class="gmail_extra">printf( "cadena = %s\tpuntero = %s", szCadena, ptr );</div><div class="gmail_extra"><br></div><div class="gmail_extra">strcpy( szCadena, "adios" );</div><div class="gmail_extra"><div class="gmail_extra">printf( "cadena = %s\tpuntero = %s", szCadena, ptr );</div><div><br></div><div><div class="gmail_extra">strcpy( szCadena, "mundo" );</div><div class="gmail_extra"><div class="gmail_extra">strcpy( szCadena, "colina" );</div><div class="gmail_extra"></div><div class="gmail_extra">printf( "cadena = %s\tpuntero = %s", szCadena, ptr );</div><div><br></div><div><div class="gmail_extra">strcpy( szCadena, "tornado" );</div><div class="gmail_extra"><div class="gmail_extra">strcpy( szCadena, "jardin" );</div><div class="gmail_extra"></div><div class="gmail_extra"><br></div></div><div class="gmail_extra"></div><div class="gmail_extra">printf( "puntero = %s", ptr );</div></div><div><br></div><div>Obviamente, la última sentencia mostrará el contenido guardado en 'szCadena', pero a través de 'ptr'.</div></div></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">En general, cualquier comportamiento raro (y posiblemente indeseado) concerniendo "datos mágicos", que aparecen y desaparecen, se puede atribuir al (mal) uso de punteros y al de arrays (i.e.: si nos extendemos pasado los confines de memoria asignada), con casi un 95% de confianza. En otras palabras, empieza culpando los punteros y arrays.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Espero que todo esto aclare las dudas.</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-12 4:29 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">Hola Steven, ante todo muchas gracias por tu respuesta, me parece interesante lo que comentas.<br>
<br>
Creo que el problema está en tu primer comentario, debo tratar lista como un array y no como char* (lo voy a rehacer ahora mismo y luego te cuento).<br>
<br>
En cuanto a la estructura "miembro", está bien (seguro) ya que otras opciones del programa la usan y uso varias veces el mismo fichero "fichas.dat" y no hay problema.<br>
<br>
Lo de hacer el fread antes de entrar en el bucle también lo he probado aunque el comportamiento era el mismo, pero lo tendré en cuenta y haré el fread antes de entrar en el while.<br>
<br>
Mi curiosidad radica en que dentro de la misma funcion "hijos()", la variable lista pierde el valor en cuanto sale del bucle "while" porque dentro del bucle compruebo con el "printf" que los valores que va tomando son correctos, pero el "printf" último pinta otra cosa, en concreto me pinta el "ente.nombre" del último registro, !!! es alucinante y no acabo de entender porque lo hace".<br>
Luego, en el cuerpo del programa, cuando recibo la cedena retornada por "hijos()", sigue siendo "la que está mal".<br>
<br>
NO ENTIENDO ESE COMPORTAMIENTO, de que fuera del bucle y aun dentro de la función, cambie de valor.<br>
<br>
Me pongo a ello.<br>
<br>
Muchas gracias.<br>
<div class=""><div class="h5"><br></div></div></blockquote><div><br></div></div></div></div>