[C con Clase] editar un fichero, pero solo una variable de una estructura. no añadir ni borrar ni leer toda la estructura en si.

Miguel Eduardo Román Martínez miguelerm en gmail.com
Vie Ene 6 03:50:22 CET 2012


Que tal Albert, creo que el detalle podría estar en el "fseek", por lo que
veo el cursor se está posicionando en el primer byte de tu estructura (en
este primer byte inicia el contenido de la variable "castellano") y ahí
mismo estas tratando de escribir el contenido de la variable
"cont_aciertos".

Podrias probar con hacer:

   //esto mueve el cursor al inicio de la estructura (done inicia
"castellano")
   fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET);

   //esto mueve el cursor a donde inicia la variable "ingles"
   fseek(fichero, 30 * sizeof(char), *SEEK_CUR*);

   //esto mueve el cursor a donde inicia la variable "tipo"
   fseek(fichero, 30 * sizeof(char), *SEEK_CUR*);

   //esto mueve el cursor a donde inicia la variable "cont_aciertos"
   fseek(fichero, 30 * sizeof(char), *SEEK_CUR*);

y creo que si después de estas líneas haces el "fwrite" ya escribiría en la
posición que le corresponde y antes de leer nuevamente la estructura
tendrías que regresar la posición con "fseek".

Siempre existe la otra opción de que una vez ubicado en la primer posición
de la estructura reescribir la estructura completa.

Espero haberte ayudado en algo.

Saludos,
Miguel.


2012/1/5 Albert Montolio <albert.montolio en gmail.com>

> Hola, soy principiante en esto de programar, aunque hice en carrera, y
> ahora que tengo tiempo libre quiero aprender profundatemente.
> Llevo días intentando resolver un problema, y no hay manera.
> Tengo un fichero creado, donde se almacena la estructura palabra, donde
> dentro tiene 4 variables. Por tanto en el fichero voy escribiendo palabra
> palabra, y se van guardando bien. Puedo añadir una tras otra, las puedo
> consultar, etc. Lo que no puedo es: por ejemplo la palabra 3, que contiene
> sus 4 variables, quiero cambiar una de sus 4 variables. Se puede hacer? es
> que en ningun foro lo he encontrado, ni en paginas web d internet, ni en el
> libro de programacion que tengo. Solo se puede añadir, leer, escribir. He
> probado con el fwrite utilizando rb+, pero no me deja editar solo 1
> variable, le digo de hacerlo, y m borra toda la palabra.
> El objetivo del programa es crearme mi propia base de datos con palabras
> de ingles y su traduccion, y luego preguntarme las traducciones y
> responderlas, y ver si son correctas o no, en base a los datos que he
> guardado. Esto lo se hacer, lo que no consigo es: cada vez que aciertas, o
> fallas, almacenarlo en un contador. Aqui esta el problema. Cada vez, por
> ejemplo, que practico la palabra hello, y pongo hola. quiero que la
> variable contador de esa palabra se incremente en uno. pero las otras
> variables seguiran conteniendo hello y hola.
> me podrian ayudar porfavor? en resumen, editar una estructura pero solo 1
> campo de la estructura, previamente guardada en 1 fichero.
> aqui va lo que yo he intentado:
>
> el archivo fichero contiene palabras que con otro programa he ido
> introduciendo, por ejemplo
>
> estructura 1:
> castellano = hola
> ingles = hello
> tipo = nombre
> cont.aciertos = 0 aqui esta l problema, quiero conseguir editarlo
>
> codigo fuente:
>
> #include <stdio.h>
>
> struct t_palabra {
>        char castellano[30];
>        char ingles[30];
>        char tipo[30];
>        int cont_aciertos;
>        int cont_errores;
>        };
>
>
> int main (void)
>
> {
>     FILE *fichero;
>     struct t_palabra palabra;
>     int i;
>
>     i=0;
>
>     fichero = fopen ("datos.dat", "rb+");
>
>     if (fichero == NULL)
>        printf ("Error: No se ha podido abrir el fichero datos.dat.");
>
>     else
>
>     {
>             fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET);
>             printf ("pon el nombre de aciertos que quieras: ");
>             scanf("\n\n%d", &palabra.cont_aciertos);
>
>             fwrite (&palabra.cont_aciertos, sizeof(palabra.cont_aciertos),
> 1, fichero);
>             fread (&palabra, sizeof(palabra), 1, fichero);
>             printf ("\n%d", palabra.cont_aciertos);
>             printf ("\n%s\t\t%s\t\t%s\t\t%d", palabra.castellano,
> palabra.ingles, palabra.tipo, palabra.cont_aciertos);
>
>             fclose (fichero);
>     }
>
> fflush(stdin);
> printf("\n\nPulse Intro para finalizar...");
> getchar();
>
> }
>
> _______________________________________________
> 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/20120105/dd96058b/attachment.html>


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