[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
Dom Mar 25 21:43:37 CEST 2012


Problema con la funcion gets, y la de fgets tb.
Hola, una pregunta teorica. la funcion gets no funciona siempre, tiene
problemas con el \n. ya que si va seguida de varias gets guarda espacio en
blanco en vez de guardar lo que tiene que guardar. la funcion fgets
soluciona este problema, y guarda lo que tiene que guardar, xo a la hora de
enseñar los datos, estos salen con salto de linia incluido, es decir, es
como si guarda el \n.
alguien sabe como solucionar este problema bien?

fgets(verbo_nuevo.tipo, 20, stdin);
 gets (verbo_nuevo.tipo);


muchas gracias!



El 23 de marzo de 2012 23:27, Albert Montolio
<albert.montolio en gmail.com>escribió:

> 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/20120325/e9632c8b/attachment.html>


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