No utilizas el mismo formato para leer y escribir y ello provoca que el puntero interno del fichero no apunte siempre donde tu crees:
Código C:
Ver originalfprintf(ptr
, "%d %s %s %.2f\n", 23, "sg", "yf", 2.9); ///escribe el primer registro en el archivo
fscanf(ptr
, "%d%s%s%lf", &a
, b
, c
, &e
); ///lee el registro ingresado previamente printf("%d %s %s %.2f\n", a
, b
, c
, e
); ///y lo imprime
printf("posicion 1: %ld\n", pos1
); printf("posicion 2: %ld\n", pos2
);
Código:
23 sg 33@X 0.00
posicion 1: 15
posicion 2: 13
23 sg yf 2.90
23 sg yf 2.90
Y eso hace que los registros no se guarden exactamente donde tu pretendes. Fíjate que después de la lectura el puntero está retrasado dos bytes (en mi caso) que coincide justamente con el salto de línea. Lo que sucede después es que el segundo registro se almacena desalineado. Finalmente rebobinas e intentas leer dos registros... pero el segundo no se llega a leer porque antes de completar la lectura llegas al final del fichero... como no ha podido completar la lectura del segundo registro no te actualiza las variables y lo que acabas imprimiendo es el mismo registro dos veces (chequea el flag EOF si no te fias).
Yo he probado a homogeneizar la lectura y la escritura y me funciona correctamente:
Código C:
Ver original#define FORMAT1 "%d %s %s %.2f\n"
#define FORMAT2 "%d %s %s %f\n"
#define WRITE(fich,a,b,c,d) fprintf(ptr,FORMAT1,a,b,c,d)
#define READ(fich,a,b,c,d) fscanf(ptr,FORMAT2,a,b,c,d)
#define PRINT(a,b,c,d) printf(FORMAT1,a,b,c,d)
int main()
{
int a;
char b[10],c[10];
float e;
FILE* ptr;
if((ptr
= (fopen("texto2.txt","w+"))) != NULL
){ ///abre un archivo de texto para lectura y escritura WRITE(ptr,23,"sg","yf",2.9);
READ(ptr,&a,b,c,&e);
PRINT(a,b,c,e);
WRITE(ptr,24,"hol","utr",3.7); //escribe otro registro
READ(ptr,&a,b,c,&e); //lee e imprime
PRINT(a,b,c,e); //los
READ(ptr,&a,b,c,&e); //2 registros
PRINT(a,b,c,e); //que tiene el archivo
}
}
Resultado:
Código:
23 sg yf 2.90
23 sg yf 2.90
24 hol utr 3.70
Un saludo.