[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 4 20:24:00 CET 2012


Hola,  hice una consulta hará un par de semanas sobre un problema que tengo
que no hay manera de solucionar y no he sido capaz.
tengo un fichero con la estructura palabras, que se conforma de dos
palabras (en castellano e ingles) y dos contadores (uno de aciertos, y otro
d fallos). quiero ir preguntando cada vez la traduccion, el usuario da su
respuesta, y aumentar los contadores de aciertos y fallos dependiendo si
acierta o falla. para esto, tengo que editar el fichero el apartado de los
contadores, y es aqui donde no hay manera.

entiendo como funcionan las funciones fread, fwrite, y he utiliziado el
truco de fseek(   (-1)-sizeof(palabra), para colocarme delante la palabra
que quiero editar, xo no hay manera, no me avanza las palabras, y no
entiendo porque.  porque yo he provado todo. con un contador i, y casi
consigo la solucion, xo no ntiendo xk con este sistema no puedo llegar a la
solucion.
pego a continuacion aqui el fichero.

Muchas gracias por adelantado




#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;

struct t__virt_palabra {
       char virt_castellano[30];
       char virt_ingles[30];
       int virt_cont_aciertos;
       int virt_cont_errores;
       };
struct t__virt_palabra virt_palabra;

    fichero = fopen ("datos.dat", "rb+");


    if (fichero == NULL)
       printf ("Error: No se ha podido abrir el fichero datos.dat.");

    else
    {

        strcpy (respuesta, "hola");
        virt_palabra.virt_cont_aciertos = 0;
        virt_palabra.virt_cont_errores = 0;

        fseek(fichero, 0*sizeof(struct t_palabra), SEEK_SET);

        while (feof(fichero)==0)
        {

            fread(&palabra, sizeof(palabra), 1, fichero);
            printf ("\nEscribe la traduccion de...: ");
            printf ("\n%s: ", palabra.castellano);
            gets(respuesta);


                            if (strcmp(respuesta, palabra.ingles) == 0)
                            {
                            printf ("\nCorrecto!");


                                   strcpy (virt_palabra.virt_castellano,
palabra.castellano);
                                   strcpy (virt_palabra.virt_ingles,
palabra.ingles);

                                   virt_palabra.virt_cont_aciertos =
palabra.cont_aciertos + 1;


                                   fseek(fichero, (-1)*sizeof(struct
t_palabra), SEEK_SET);

                                   strcpy (palabra.castellano,
virt_palabra.virt_castellano);
                                   strcpy (palabra.ingles,
virt_palabra.virt_ingles);
                                   palabra.cont_aciertos =
virt_palabra.virt_cont_aciertos;


                                   fwrite (&palabra, sizeof(palabra), 1,
fichero);



                            }
                            else
                                {

                                printf ("\nIncorrecto.");


                                   virt_palabra.virt_cont_errores =
palabra.cont_errores + 1;
                                   strcpy (virt_palabra.virt_castellano,
palabra.castellano);
                                   strcpy (virt_palabra.virt_ingles,
palabra.ingles);

                                   fseek(fichero, (-1)*sizeof(struct
t_palabra), SEEK_SET);

                                   strcpy (palabra.castellano,
virt_palabra.virt_castellano);
                                   strcpy (palabra.ingles,
virt_palabra.virt_ingles);
                                   palabra.cont_errores =
virt_palabra.virt_cont_errores;


                                   fwrite (&palabra, sizeof(palabra), 1,
fichero);


                                }


            }


        fclose (fichero);


        }


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



}
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120304/a02e30d9/attachment.html>


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