
17/06/2009, 14:46
|
| | Fecha de Ingreso: diciembre-2008 Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 16 años, 2 meses Puntos: 12 | |
Respuesta: Problemas con apuntadores y archivos Ok, el problema de cuando reemplaza es porque te explico:
Al abrir el archivo en modo rb+ el puntero del fichero se situa al principio del fichero, es decir, antes del primer registro, si revisas, no mueves ese puntero antes de usar el fwrite, y por eso te lo reemplaza, en cambio si abrieras el archivo en ab+ el puntero se situa al final del fichero si es que éste existe.
F = fopen("D:/trabajo/Agenda.dat","rb+");
if(F==NULL)
{
printf(" No se puede abrir el archivo\n");
system("pause");
exit(1);
} fseek(F,0L,2); //te mueve el puntero al final del fichero
fwrite(*p,sizeof(struct persona),1,F);
printf("\n\n\tDOCENTE ARCHIVADO!!!");
----------------------------
Por otro lado, el problema de la visualización, está en que, al abrir el fichero, y acontinuación haces un while(!feof(F)), empiezas dentro del bucle, imprimiendo obviamente basura, ya que no hicistes ningun fread antes de la primera impresión, entonces quedaría así:
F = fopen("D:/trabajo/Agenda.dat","rb");
if(F==NULL)
{
printf("\n\tNo se puede abrir el archivo\n");
exit(1);
} fread(p,sizeof(struct persona),1,F);
while(!feof(F))
{
printf("%s",p->nom);
printf("\t\t%s",p->ap);
cout<<"\n\n";
fread(p,sizeof(struct persona),1,F);
}
fclose(F);
system("pause");
Otra cosa que no recuerdo ahora, es que al usar puntero a puntero, no se si sigue necesitando o no, usar el & en fread/fwrite, pero puedes probar:
fread(p,sizeof(struct persona),1,F);
O
fread(&p,sizeof(struct persona),1,F);
Espero eso te solucione algún que otro problema. |