[C con Clase] problemas con la posicion del puntero en un fichero, funciones fread, frwite, fseek etc.
Albert Montolio
albert.montolio en gmail.com
Mar Mar 6 22:09:08 CET 2012
Agradecer a Oscar Alberto y a Salvador la ayuda.
Oscar Alberto tu programa funciona genial, justo lo que queria, los
contadores sirven simplemente para saber que palabras cuesta memorizar,
palabra k aprendes pues la introduces, y el programa te las va preguntando.
Lo que justo acabo de empezar a programar, y no entiendo muy bien algunas
cosas k utilizas, creo que utilizas C++, no ntiendo cosas cmo cout<<, using
namespace std; etc, xo wno, ya llegara.
A Salvador le queria preguntar como es que a el le ha funcionado. Has
utilizado mi codigo fuente? porque el problema que dices tu, que quizas mi
fichero datos.dat esta corrompido, no es, xk cada vez lo borro y lo vuelvo
a crear. Y escribo nuevas palabras. Te escribo el codigo fuente d como
escribo las palabras x si alli estuviese mi error, xo no creo. Entonces,
has utilizado mi codigo fuente y te ha funcionado, o has modificado un
poco? si eres tan amable de indicarme el error, o simplemente mandarme el
tuyo para comparar te lo agradeceria. a mi me sigue leyendo la segunda y
repitiendo la ultima (en mi codigo, el codigo de Oscar Alberto funciona
perfectamente, xo quiero reparar el mio para aprender poco a poco)
Muchas gracias a todos y pongo los dos codigos a continuacion, el de
escribir la palabra y el de ejercitarla.
ESCRIBIR PALABRA
#include <stdio.h>
struct t_palabra {
char castellano[30];
char ingles[30];
int cont_aciertos;
int cont_errores;
//float efectividad;
};
int main (void)
{
FILE *fichero;
struct t_palabra palabra;
int n;
fichero = fopen ("datos.dat", "ab+");
if (fichero == NULL)
printf ("Error: No se ha podido abrir el fichero datos.dat.");
else
{
//fseek(fichero, sizeof(struct t_ficha), SEEK_SET);
printf ("\n\nCastellano: ");
gets (palabra.castellano);
printf ("\n\nIngles: ");
gets (palabra.ingles);
//printf ("\n\nTipo: ");
//gets (palabra.tipo);
palabra.cont_aciertos = 0;
palabra.cont_errores = 0;
//palabra.efectividad = 0.0;
//printf ("\n\nContador aciertos: ");
//scanf("\n\n%d", &palabra.cont_aciertos);
//printf ("\n\nContador errores: ");
//scanf("\n\n%d", &palabra.cont_errores);
//printf ("\n\nEfectividad: ");
//scanf("\n\n%f", &palabra.efectividad);
//palabra.cont_aciertos=0;
//palabra.cont_errores=0;
fwrite (&palabra, sizeof(palabra), 1, fichero);
// el cursor, se queda despues de la ultima palabra, para
volver a escribir detras.
fclose (fichero);
}
fflush(stdin);
printf("\n\nPulse Intro para finalizar...");
getchar();
}
EJERCITAR PALABRA
-------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
struct t_palabra { // t_palabra es una estructura que
contiene castellano ingles y contadores de aciertos y fallos
char castellano[30];
char ingles[30];
int cont_aciertos;
int cont_errores;
};
int main (void)
{
FILE *fichero; // apunta al fichero donde se
guardaran las palabras y sus aciertos/fallos
struct t_palabra palabra; // definim la variable paraula.
char respuesta[50]; // l'usuari entra la seva resposta
int i; // recorrer el ficher
struct t__virt_palabra { // l'utilitzo per augmentar els
contadors cada cop k l'usuari practica 1 paraula. (nose una altre manera de
fer-ho)
char virt_castellano[30];
char virt_ingles[30];
int virt_cont_aciertos;
int virt_cont_errores;
};
struct t__virt_palabra virt_palabra; // definim la variable
virt_palabra
fichero = fopen ("datos.dat", "rb+"); // s'obre el ficher
datos.dat. rb+ es correcte????? al ficher hi ha tant caracters
// castellano,
ingles, com enters (els contadors) x tant te que ser binari, no?
if (fichero == NULL) // salta en cas
que no existeixi l ficher datos.dat
printf ("Error: No se ha podido abrir el fichero datos.dat.");
else
{
i=0;
strcpy (respuesta, "hola");
virt_palabra.virt_cont_aciertos = 0;
virt_palabra.virt_cont_errores = 0;
fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET); // se pone el
cursor al inicio de todo xk i=0
while (!feof(fichero)) // preguntar al
usuari paraules, fins k sarrivi a la ultima paraula,
{ // despres
d'aquesta tindria que parar!!!!! i no ho fa :s, tornar a preguntar
// sempre la
ultima :(
if(fread(&palabra, sizeof(palabra), 1, fichero)) {
//fread(&palabra, sizeof(palabra), 1, fichero); // en la
primera iteracio, llegirm la primera paraula gracies a i=0
printf ("\nEscribe la traduccion de...: "); // preguntem
la paraula
printf ("\n%s: ", palabra.castellano);
gets(respuesta); // l'usuari
entra la paraula
// analitzar si l'usuari la encertat, o fallat, i incrementar
els contadors corresponents x cada paraula
if (strcmp(respuesta, palabra.ingles) == 0) //
compara resposta amb palabra.ingles si es correcte...
{
printf ("\nCorrecto!"); // felicitem
al usuari x cortesia, tenim que incrementar el contador d'encerts
// com que no es pot modificar nomes 1
apartat de la estructura paraula, tenim que introduir de nou tot...
// copiem a la variable virtual (nomes
serveix x traspar informacio) la paraula i la seva traduccio
strcpy (virt_palabra.virt_castellano,
palabra.castellano);
strcpy (virt_palabra.virt_ingles,
palabra.ingles);
// incrementem el contador una unitat
//palabra.cont_aciertos a la primera
iteració val 0 (aixi sa inicialitzat)
// i ho guardem a la virtual tb, x tal d
copiar tot again.
virt_palabra.virt_cont_aciertos =
palabra.cont_aciertos + 1;
// important: com que hem utilitzat
fread, el curso esta darrera la paraula llegida ara!!
// la variable virtual conte les noves
dades, es a dir, amb el contador incrementat,
// x tant, tenim que ficar el cursor al
inici de la paraula k estavem treballant, xk
// escrigui la informacio just a sobre
de la paraula antiga
// ara la i estava a la posicio dspres
de size of (equivalent a i=0), es a dir, dspres de la primera paraula
// en la primera iteració, ja que la i
val 0, amb aquesta comanda tornem a la posicio inical
fseek(fichero, i*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;
// i podem sobreescriure la paraula que
voliem
fwrite (&palabra, sizeof(palabra), 1,
fichero);
// important, el cursor torna a estar
darrera de la primera paraula (en primera iteracio)
} // sino es correcte...
else
{
printf ("\nIncorrecto.");
virt_palabra.virt_cont_errores =
palabra.cont_errores + 1; // mateixa estrategia
strcpy (virt_palabra.virt_castellano,
palabra.castellano);
strcpy (virt_palabra.virt_ingles,
palabra.ingles);
fseek(fichero, i*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);
// important, ara el cursor esta despres
de la paraula treballada
}
// hem acabat la primera iteracio
i++; // incrementem la i, per tal danar a la propera paraula.
fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET); //
coloquem el cursor a la seguent posicio, es a dir, a la posicio 1,
// es a
dir, a la segona paraula. nem cap a dalt, ja que al ficher
//
encara hi ha paraules, i tooorneeem a fer el while.
}
else {
printf ("\nfin!");
}
}
fclose (fichero);
}
fflush(stdin);
printf("\n\nPulse Intro para finalizar...");
getchar();
}
El 6 de marzo de 2012 09:50, Salvador Pozo <salvador en conclase.net> escribió:
> El pasado 2012-03-05 22:46:02, Albert_Munich escribió:
>
> A> Hola Salvador, he aplicado el cambio que me has dicho, y sigue pasando
> lo
> A> mismo, no lee la primera palabra, lee la segunda, y la ultima palabra la
> A> escribe dos veces :S
>
> Hola:
>
> He ejecutado tu programa y funciona perfectamente. Es posible que el
> fichero de datos se haya corrompido por la ejecución de versiones
> anteriores, a mi me pasó eso.
>
> Ya me contarás, 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/20120306/8a42a014/attachment.html>
Más información sobre la lista de distribución Cconclase