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

Albert Montolio albert.montolio en gmail.com
Dom Mar 11 15:24:14 CET 2012


Hola, alguien me podría ayudar con el metodo de la burbuja? lo quiero
aplicar a estructuras, xo tengo problemas con el final del archivo.
quiero ordenar un numero concreto de estructuras, que cada una contiene un
float, y las quiero ordenar por ese float.
Muchas gracias

aqui esta el ejemplo, considerando que hay 4 palabras escritas (xk dudo
mucho en el valor de jota)

#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;
   float virt1, virt2;



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

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

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

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

                fseek(fichero, i*sizeof(palabra), SEEK_SET);
                fread(&palabra, i*sizeof(palabra), 1, fichero);
                virt1 = palabra.eff;
                fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
                fread(&palabra, sizeof(palabra), 1, fichero);
                virt2 = palabra.eff;

                if (virt1 > virt2){

                fseek(fichero, i*sizeof(palabra), SEEK_SET);
                fread(&palabra, 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;

                fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
                fread(&palabra, sizeof(palabra), 1, fichero);
                fseek(fichero, i*sizeof(palabra), SEEK_SET);
                fwrite (&palabra, 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;
                fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
                fwrite (&palabra, sizeof(palabra), 1, fichero);


                }
                }
                }



       fclose (fichero);


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

}


El 10 de marzo de 2012 16:01, Albert Montolio
<albert.montolio en gmail.com>escribió:

> 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/20120311/ef9a9d36/attachment.html>


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