[C con Clase] Método de la burbuja (era: problemas con la posicion del puntero en un fichero, funciones fread, frwite, fseek etc.)

Albert Montolio albert.montolio en gmail.com
Vie Mar 23 23:27:18 CET 2012


Problema con EDITAR un fichero que contiene estructuras.
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

//*--------------------------------------------------------------------

void editar_entrada ()

{

printf("\n Ha elegido la opcion : Editar entrada.\n");
printf("\n");
struct t_palabra {
       char castellano[80];
       char aleman[80];
       };

//void incrementar(int *n);

FILE *fichero;
struct t_palabra palabra;

    //void ordenar_por_peor ();

struct t_palabra temp;
char respuesta[40];
int i, j, nPalabras, max;
float virt1, virt2;
float total; //suma de los contadores
char entradaeditar[80]; //el usuario elije la palabra a modificar

char castellanoentrada[80]; el usuario indica los nuevos valores
char alemanentrada[80];


    //printf("\n Ha elegido la opcion : Editar entrada.\n");
    printf("\n");
    printf ("Que entrada desea editar?: ");
    fflush(stdin);
    gets (entradaeditar);

    fichero = fopen ("datos.dat", "rb+");
    encontradaentrada == false;
    if (fichero == NULL)
       printf ("Error: No se ha podido abrir el fichero datos.dat.");
    else
    {
        fread(&palabra, sizeof(palabra), 1, fichero);

        while (feof(fichero)==0)
        {

              if ((strcmp(entradaeditar, palabra.castellano)==0))
              {

                   printf ("La etiqueta se ha encontrado y contiene la
siguiente informacion:");
                   printf ("\n");
                   printf ("\nCastellano: %s", palabra.castellano);
                   printf ("\nAleman: %s", palabra.aleman);

                   printf ("A continuacion introduce los nuevos valores: ");
                   printf ("\nCambiar %s (Castellano) por: ",
palabra.castellano);
                   gets (castellanoentrada);
                   printf ("\nCambiar %s (Aleman) por: ", palabra.aleman);
                   gets (alemanentrada);

                   strcpy (palabra.castellano, castellanoentrada);
                   strcpy (palabra.aleman, alemanentrada);



                   fseek(fichero, (-1)*sizeof(struct t_palabra), SEEK_CUR);
                   fwrite (&palabra, sizeof(palabra), 1, fichero);
                   printf ("\n");
                   printf ("\nLa palabra ha sido actualizada.");
                   fflush(stdin);

               }
                 else {

                      }


              fread(&palabra, sizeof(palabra), 1, fichero);
              i++;
        }

        fclose (fichero);
    }

fflush(stdin);
printf("\n\nPulse Intro para finalizar...");
getchar();

}

El 21 de marzo de 2012 20:38, Salvador Pozo <salvador en conclase.net>escribió:

> El pasado 2012-03-21 19:12:37, Albert_Munich escribió:
>
> A> Hola, una pregunta corta, que no he encontrado por internet.
> A> trabajando con booleanas, que diferencia hay entre = y == ?
>
> Hola:
>
> En todos los lenguajes de programación existen diferencias entre
> asignaciones y comparaciones. C y C++ no son una excepción.
>
> En algunos lenguajes, para diferenciar mejor las dos operaciones, se usan
> operadores diferentes. Este es el caso por el que preguntas.
>
> 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:
> a = 10+2;
> Asigna a "a" el resultado de evaluar la expresión 10+2, es decir, 12.
>
> 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:
> (10+2) == 12
> Da como resultado true.
> 0 == 232
> Da como resultado false.
>
> A> es que dependiendo lo que pongo, mi programa se comporta muy diferente
> A> palabraencontrada = false, o palabraencontrada == false?
>
> Por supuesto que el resultado es diferente.
>
> Si usas la primera expresión dentro de un if pasa lo siguiente:
> 1) Se asigna a palabraencontrada el valor false
> 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.
>
> Si usas la segunda expresión dentro de un if, pasa esto:
> 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.
>
> A> y dentro los while y if, que se ha de poner?
> A> if (palabraencontrada=false) o if(palabraencontrada==false)
> A> dependiendo si pongo 1 o 2 iguales el programa me cambia mucho, y como
> A> tengo muchas booleanas, no puedo encontrar el error. alguien me lo
> podria
> A> aclarar?
>
> Eso es decisión tuya :)
> Seguramente tendrás que usar la segunda.
>
> Algunas notas y "trucos" más sobre este tema:
>
> Cuando hagas comparaciones, si una de las expresiones es constante, es
> mejor ponerla en primer lugar. Por ejemplo:
> a == 10 equivale a 10 == a
> 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.
>
> Cuando compares con true o false, puedes ahorrarte la comparación, por
> ejemplo:
>
> (a == true) equivale a usar (a)
> (a == false) equivale a usar (!a)
> (a != true) equivale a (!a)
> (a != false) equivale a (a)
>
> Hasta pronto.
>
> --
> Salvador Pozo (Administrador)
> mailto:salvador en conclase.net
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120323/11b85aeb/attachment.html>


Más información sobre la lista de distribución Cconclase