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

Salvador Pozo salvador en conclase.net
Mar Mar 6 22:46:35 CET 2012


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


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