[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