[C con Clase] problemas con la posicion del puntero en un fichero, funciones fread, frwite, fseek etc.

Albert Montolio albert.montolio en gmail.com
Sab Mar 10 16:01:31 CET 2012


Hola, tengo un problema con el metodo de la burbuja. Lo se hacer para una
serie de numeros simples, xo no me ha salido para una estructura.
tengo un fichero donde contiene la estructura palabra, formada por palabras
y un contador que es la efectividad. quiero ordenar de menor a mayor a
efectividad todas las palabras (con todos sus campos dentros)
He implementando este metodo de la burbuja, para ordenar el fichero, pero
no me lo ordena, me lo deja igual. Alguien me podria ayudar a buscar el
error?¿ muchas gracias de antemano



#include <stdio.h>
#include <string.h>

struct t_palabra {
   char castellano[40];
   char aleman[40];
   float cont_aciertos;
   float cont_errores;
   float eff;
};

int main (void)
{
   FILE *fichero;
   struct t_palabra palabra;
   struct t_palabra temp;
   char respuesta[40];
   int i, j, nPalabras;



   fichero = fopen ("datos.dat", "rb+");
   if (fichero == NULL)
      printf ("Error: No se ha podido abrir el fichero datos.dat.");
   else {

        for (j=2; j>0; j--){

            fseek(fichero, 0*sizeof(palabra), SEEK_SET);

            for (i=0; i<j; i++){

                if (fread(&palabra, i*sizeof(palabra), 1, fichero) <
fread(&palabra, (i+1)*sizeof(palabra), 1, fichero)){

                fread(&palabra, i*sizeof(palabra), 1, fichero);
                //fwrite (&temp, i*sizeof(palabra), 1, fichero);

                strcpy (temp.castellano, palabra.castellano);
                strcpy (temp.aleman, palabra.aleman);
                temp.cont_aciertos = palabra.cont_aciertos;
                temp.cont_errores = palabra.cont_errores;
                temp.eff = palabra.eff;

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

                strcpy (palabra.castellano, temp.castellano);
                strcpy (palabra.aleman, temp.aleman);
                palabra.cont_aciertos = temp.cont_aciertos;
                palabra.cont_errores = temp.cont_errores;
                palabra.eff = temp.eff;

                fwrite (&palabra, (i+1)*sizeof(palabra), 1, fichero);


                }
                }
                }



       fclose (fichero);


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

}

El 8 de marzo de 2012 09:48, Albert Montolio
<albert.montolio en gmail.com>escribió:

> muchas gracias por la ayuda
>
> El 6 de marzo de 2012 22:46, Salvador Pozo <salvador en conclase.net>escribió:
>
> El pasado 2012-03-06 21:08:55, Albert_Munich escribió:
>>
>> A> A Salvador le queria preguntar como es que a el le ha funcionado. Has
>> A> utilizado mi codigo fuente?
>>
>> Hola:
>>
>> He utilizado tu programa, lo he hecho de nuevo ahora, y a mi me funciona
>> correctamente. No entiendo lo que puede estar pasando.
>>
>> Te paso "mi versión" del programa, espero que te ayude.
>>
>> ----8<------
>> #include <stdio.h>
>> #include <string.h>
>>
>> struct t_palabra {
>>     char castellano[30];
>>    char ingles[30];
>>    int cont_aciertos;
>>    int cont_errores;
>> };
>>
>> int main (void)
>> {
>>    FILE *fichero;
>>     struct t_palabra palabra;
>>    char respuesta[30];
>>     int i, nPalabras;
>>
>> /* Crea un fichero con dos palabras, quitar los comentarios para que lo
>> haga cada vez */
>> /*
>>    fichero = fopen ("datos.dat", "wb+");
>>    strcpy(palabra.castellano, "casa");
>>    strcpy(palabra.ingles, "house");
>>    palabra.cont_aciertos = palabra.cont_errores = 0;
>>    fwrite(&palabra, sizeof(palabra), 1, fichero);
>>    strcpy(palabra.castellano, "coche");
>>    strcpy(palabra.ingles, "car");
>>    fwrite(&palabra, sizeof(palabra), 1, fichero);
>>    fclose(fichero);
>> */
>>
>>    fichero = fopen ("datos.dat", "rb+");
>>     if (fichero == NULL)
>>       printf ("Error: No se ha podido abrir el fichero datos.dat.");
>>    else {
>>         i=0;
>>        while(!feof(fichero))
>>        {
>>            fseek(fichero, i*sizeof(palabra), SEEK_SET);
>>            if(fread(&palabra, sizeof(palabra), 1, fichero) > 0) {
>>                 printf ("\nEscribe la traduccion de...: ");
>>                 printf ("\n%s: ", palabra.castellano);
>>                gets(respuesta);
>>                 if (!strcmp(respuesta, palabra.ingles)) {
>>                    printf ("\nCorrecto!");
>>                    palabra.cont_aciertos++;
>>                 } else {
>>                    printf ("\nIncorrecto.");
>>                     palabra.cont_errores++;
>>                }
>>                fseek(fichero, (-1)*sizeof(struct t_palabra), SEEK_CUR);
>>                 fwrite (&palabra, sizeof(palabra), 1, fichero);
>>                 i++;
>>             }
>>        }
>>        fclose (fichero);
>>    }
>>    fflush(stdin);
>>    printf("\n\nPulse Intro para finalizar...");
>>    getchar();
>>
>> /* Parte para ver el estado final del fichero, quitar comentarios para
>> activar */
>> /*
>>     fichero = fopen ("datos.dat", "rb+");
>>     rewind(fichero);
>>    while(!feof(fichero)) {
>>        if(fread(&palabra, sizeof(palabra), 1, fichero)) {
>>            printf("%s Ac: %d Er: %d\n", palabra.castellano,
>> palabra.cont_aciertos, palabra.cont_errores);
>>        }
>>    }
>>    fclose (fichero);
>> */
>>    return 0;
>> }
>> ----8<------
>>
>> 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/20120310/f59c971c/attachment.html>


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