[C con Clase] Problemas de escritura en archivo.

Salvador Pozo salvador en conclase.net
Mie Mayo 28 10:06:01 CEST 2008


El pasado 2008-05-27 19:06:02, Javier Cancio escribió:
 
JC> Buenas! Estoy intentando hacer un programa para ver el funcionamiento del
JC> tratamiento de ficheros. La aplicación en cuestión pide 3 usuarios con sus
JC> respesctivos años, y después lee el fichero y comprueba si uno de los
JC> usuarios se llama "Javi", si es asi cambia su edad a 99 y lo actualiza. Y
JC> luego recorre el fichero y si existe el usuario "Javi" muestra su edad
JC> actualizada (99).
JC> El problema es que no actualiza la edad correctamente, y al mostrar la
JC> supuesta edad actualizada, muestra la que introduje por teclado.

Hola:

Veo dos problemas en tu código.

El primero no afecta demasiado al resultado, aunque puede llegar a ser importante. Estas usando estructuras en las que se mezclan cadenas y valores enteros, y por lo tanto, se trata de estructuras binarias. Tu fichero deberías ser también binario y no de texto. Es decir, usar la opción "b" en lugar de "t".

El segundo error, que explica por qué no funciona tu programa, es que antes de hacer una escritura en un fichero de acceso aleatorio es necesario colocar el cursor de escritura en la posición adecuada.

Esto se hace mediante una función fseek, tu código, en esa parte, quedaría así:

---8<-----
       /* Actualizacion de los datos */ 
       if((prueba=fopen("prueba.dat", "rb+"))==NULL) 
       printf("\nError al abrir el archivo"); 

       while(!encontrado && fread(&persona, sizeof(persona), 1, prueba)){ 
              if(strcmp(persona.nombre, "Javi")==0){ 
                 persona.edad=99; 
                 encontrado=1;
                 fseek(prueba, -sizeof(persona), SEEK_CUR);
                 fwrite(&persona, sizeof(persona), 1, prueba);
          } 
       } 
       fclose(prueba); 
---8<-----

Mediante esta función retrocedemos la cantidad necesaria de bytes para sobrescribir el registro correspondiente a "Javi".

En realidad, tal como estaba el programa, se debería sobrescribir el registro siguiente al de "Javi", y si no existe, añadirse a continuación.

Probablemente, en algunos compiladores, eso será lo que sucede, aunque no con el que usa Dev-c++. Supongo que el sistema se da cuenta de que estamos haciendo una lectura secuencial del fichero, y no actualiza el cursor de escritura al mismo tiempo que el de lectura.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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