Problema con EDITAR un fichero que contiene estructuras.<div>Intento editar un fichero, solo 1 estructura del archivo concreta, y la edita, xo despues no sigue haciendo lo que deberia, el comportamiento no es correcto. hay una serie de estructuras, con diferentes palabras, y hay dos que estan repetidas. quiero acceder a una de las dos, editarla por otra, y tema solucionado. el programa lo hace bien la primera accion, pero luego se queda encallado, no entiendo porque no lee la segunda. alguien entiende porque? aqui el codigo fuente. gracias</div>
<div><br></div><div><div>//*--------------------------------------------------------------------</div><div><br></div><div>void editar_entrada ()</div><div><br></div><div>{</div><div><br></div><div>printf("\n Ha elegido la opcion : Editar entrada.\n");   </div>
<div>printf("\n");</div><div>struct t_palabra {</div><div>       char castellano[80];</div><div>       char aleman[80];</div><div>       };</div><div>       </div><div>//void incrementar(int *n);</div><div>       </div>
<div>FILE *fichero;</div><div>struct t_palabra palabra;</div><div>    </div><div>    //void ordenar_por_peor ();</div><div><br></div><div>struct t_palabra temp;</div><div>char respuesta[40];</div><div>int i, j, nPalabras, max;</div>
<div>float virt1, virt2;</div><div>float total; //suma de los contadores</div><div>char entradaeditar[80]; //el usuario elije la palabra a modificar</div><div><br></div><div>char castellanoentrada[80]; el usuario indica los nuevos valores</div>
<div>char alemanentrada[80];</div><div><br></div><div>    </div><div>    //printf("\n Ha elegido la opcion : Editar entrada.\n");</div><div>    printf("\n");</div><div>    printf ("Que entrada desea editar?: ");</div>
<div>    fflush(stdin);</div><div>    gets (entradaeditar);</div><div>    </div><div>    fichero = fopen ("datos.dat", "rb+");</div><div>    encontradaentrada == false;</div><div>    if (fichero == NULL)</div>
<div>       printf ("Error: No se ha podido abrir el fichero datos.dat.");</div><div>    else</div><div>    {</div><div>        fread(&palabra, sizeof(palabra), 1, fichero);</div><div>        </div><div>        while (feof(fichero)==0)</div>
<div>        {</div><div>              </div><div>              if ((strcmp(entradaeditar, palabra.castellano)==0)) </div><div>              {</div><div>                   </div><div>                   printf ("La etiqueta se ha encontrado y contiene la siguiente informacion:");</div>
<div>                   printf ("\n");</div><div>                   printf ("\nCastellano: %s", palabra.castellano);</div><div>                   printf ("\nAleman: %s", palabra.aleman);</div>
<div>                  </div><div>                   printf ("A continuacion introduce los nuevos valores: ");</div><div>                   printf ("\nCambiar %s (Castellano) por: ", palabra.castellano);</div>
<div>                   gets (castellanoentrada);</div><div>                   printf ("\nCambiar %s (Aleman) por: ", palabra.aleman);</div><div>                   gets (alemanentrada);</div><div>                    </div>
<div>                   strcpy (palabra.castellano, castellanoentrada);</div><div>                   strcpy (palabra.aleman, alemanentrada);</div><div>                  </div><div>                   </div><div>                   </div>
<div>                   fseek(fichero, (-1)*sizeof(struct t_palabra), SEEK_CUR);</div><div>                   fwrite (&palabra, sizeof(palabra), 1, fichero);</div><div>                   printf ("\n");</div>
<div>                   printf ("\nLa palabra ha sido actualizada.");</div><div>                   fflush(stdin);</div><div>                                             </div><div>               } </div><div>                 else {</div>
<div>                   </div><div>                      } </div><div>              </div><div>              </div><div>              fread(&palabra, sizeof(palabra), 1, fichero);</div><div>              i++;</div><div>
        }</div><div>        </div><div>        fclose (fichero);</div><div>    }</div><div>        </div><div>fflush(stdin);</div><div>printf("\n\nPulse Intro para finalizar...");</div><div>getchar();</div><div>
               </div><div>}</div><br><div class="gmail_quote">El 21 de marzo de 2012 20:38, Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net">salvador@conclase.net</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
El pasado 2012-03-21 19:12:37, Albert_Munich escribió:<br>
<br>
A> Hola, una pregunta corta, que no he encontrado por internet.<br>
A> trabajando con booleanas, que diferencia hay entre = y == ?<br>
<br>
Hola:<br>
<br>
En todos los lenguajes de programación existen diferencias entre asignaciones y comparaciones. C y C++ no son una excepción.<br>
<br>
En algunos lenguajes, para diferenciar mejor las dos operaciones, se usan operadores diferentes. Este es el caso por el que preguntas.<br>
<br>
El operador = es el de asignación. Se asigna al operando a la izquierda el valor de la expresión a la derecha, por ejemplo:<br>
a = 10+2;<br>
Asigna a "a" el resultado de evaluar la expresión 10+2, es decir, 12.<br>
<br>
El operador == es el de comparación, el resultado de aplicar este operador a las expresiones a la derecha e izquierda de él es un valor booleano: true o false. Si las expresiones son equivalentes, el resultado es true, en caso contrario, false. Por ejemplo:<br>

(10+2) == 12<br>
Da como resultado true.<br>
0 == 232<br>
Da como resultado false.<br>
<br>
A> es que dependiendo lo que pongo, mi programa se comporta muy diferente<br>
A> palabraencontrada = false, o palabraencontrada == false?<br>
<br>
Por supuesto que el resultado es diferente.<br>
<br>
Si usas la primera expresión dentro de un if pasa lo siguiente:<br>
1) Se asigna a palabraencontrada el valor false<br>
2) La expresión obtenida se evalúa como un booleano, en este caso ya lo es, si no lo fuera se hace un casting (conversión de tipo). En este caso, el valor es false, siempre, independientemente del valor previo de palabraencontrada.<br>

<br>
Si usas la segunda expresión dentro de un if, pasa esto:<br>
1) Se compara el valor de palabraencontrada con false. Si son iguales, es decir, si palabraencontrada es false, el resultado es true, ya que son iguales, y la sentencia if se ejecuta. Si palabraencontrada es true, el resultado es false, ya que son distintas.<br>

<br>
A> y dentro los while y if, que se ha de poner?<br>
A> if (palabraencontrada=false) o if(palabraencontrada==false)<br>
A> dependiendo si pongo 1 o 2 iguales el programa me cambia mucho, y como<br>
A> tengo muchas booleanas, no puedo encontrar el error. alguien me lo podria<br>
A> aclarar?<br>
<br>
Eso es decisión tuya :)<br>
Seguramente tendrás que usar la segunda.<br>
<br>
Algunas notas y "trucos" más sobre este tema:<br>
<br>
Cuando hagas comparaciones, si una de las expresiones es constante, es mejor ponerla en primer lugar. Por ejemplo:<br>
a == 10 equivale a 10 == a<br>
Sin embargo la segunda tiene una ventaja. Si por error ponemos sólo un "=", la segunda dará un error al compilar, ya que no es posible asignar valores a una constante.<br>
<br>
Cuando compares con true o false, puedes ahorrarte la comparación, por ejemplo:<br>
<br>
(a == true) equivale a usar (a)<br>
(a == false) equivale a usar (!a)<br>
(a != true) equivale a (!a)<br>
(a != false) equivale a (a)<br>
<div class="HOEnZb"><div class="h5"><br>
Hasta pronto.<br>
<br>
--<br>
Salvador Pozo (Administrador)<br>
mailto:<a href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br></div>