me falla el leer y guardar

agenda con lista
06 de Junio del 2010
nose como realizar el leer para que lea el archivo en c

typedef struct nodoagenda{
int dni;
char nombre[15];
char apellidos[25];
char direccion[30];
struct nodoagenda *ant;
struct nodoagenda *sig;
}nodoagenda;


void CrearAgenda(nodoagenda *(&));

int AgendaVacia(nodoagenda *);

int AgendaLlena(nodoagenda *);

int EstaElementoAgenda(nodoagenda *,int);

void InsertarAgenda(nodoagenda *(&));

void EliminarElementoAgenda(nodoagenda *(&));

void MostrarInversoAgenda(nodoagenda *);

void BorrarAgenda(nodoagenda *(&));

void GuardarAgenda(nodoagenda *);

void LeerAgenda(nodoagenda *listad);



//
void CrearAgenda(nodoagenda *(&listad))
{
listad = NULL;
}
/*****************************************************************************************/
int AgendaVacia(nodoagenda *listad)
{
int dev = 0;

if (listad==NULL)
dev = -1;

return dev;
}
/*****************************************************************************************/
// Controlaremos la memoria en la insercion de elementos en la lista
int AgendaLlena(nodoagenda *)
{
return 0;
}
/*****************************************************************************************/
// Devuelve -1 si el elemento esta en la lista. 0 en caso contrario
int EstaElementoAgenda(nodoagenda *listad,int dni)
{
nodoagenda *Paux;
int res;

Paux = listad;
while ((Paux != NULL)&&(Paux->dni != dni))
Paux = Paux->sig;

if (Paux == NULL)
res = 0;
else
res = -1;

return res;
}
/*****************************************************************************************/
void InsertarAgenda(nodoagenda *(&listad))
{
nodoagenda *Nuevonodo, *Paux;
int dni;
char nombre[15],apellidos[25];

Nuevonodo = (nodoagenda *)malloc(sizeof(nodoagenda));
if (Nuevonodo == NULL)
printf("\nSe produjo un error en la creación del elemento.");
else
{
do{
printf("Introduce el dni: ");
scanf("%d",&dni);
}while((dni < 1)||(EstaElementoAgenda(listad,dni)));
Nuevonodo->dni = dni;
fflush(stdin); //Borra el buffer de teclado
printf("Introduce el nombre: ");
gets(Nuevonodo->nombre);
printf("Introduce los apellidos: ");
gets(Nuevonodo->apellidos);
printf("Introduce la direccion: ");
gets(Nuevonodo->direccion);
Nuevonodo->sig = NULL;
Nuevonodo->ant = NULL;

if (AgendaVacia(listad))
listad = Nuevonodo;
else
{
if (dni > listad->dni)
{
Nuevonodo->sig = listad;
listad->ant=Nuevonodo;
listad = Nuevonodo;
}
else
{
Paux = listad;
while (((Paux->sig)!=NULL)&&((dni < Paux->sig->dni)))
Paux = Paux->sig;

if (Paux->sig != NULL) //Si no es el ultimo nodo
Paux->sig->ant=Nuevonodo;

Nuevonodo->sig = Paux->sig;
Nuevonodo->ant = Paux;
Paux->sig = Nuevonodo;

}
}
}
}

/*****************************************************************************************/
void EliminarElementoAgenda(nodoagenda *(&listad),int dni)
{
nodoagenda *actual = listad;

while (actual->dni != dni)
actual = actual->sig;

if (actual->ant == NULL) // Es el primer nodo de la lista
{
if (actual->sig!=NULL) // Hay mas de un nodo en la lista
actual->sig->ant=NULL;

listad=actual->sig;
}
else
{
if (actual->sig!=NULL) // Es el ultimo nodo de la lista
actual->sig->ant=actual->ant;

actual->ant->sig=actual->sig;
}

free(actual);
}
/*****************************************************************************************/
void MostrarInversoAgenda(nodoagenda *listad)
{
nodoagenda *paux=listad;

if (paux != NULL)
{
// Recorremos toda la lista hasta el final
while (paux->sig != NULL)
paux=paux->sig;

// Recorremos toda la lista en orden inverso hasta el primer nodo
while (paux != NULL)
{
printf("\n\nDNI: %d",paux->dni);
printf("\nNombre: %s",paux->nombre);
printf("\nApellidos: %s",paux->apellidos);
printf("\nDireccion: %s",paux->direccion);
paux=paux->ant;
}
}
}
/*****************************************************************************************/
void BorrarAgenda(nodoagenda *(&listad))
{
nodoagenda *paux;

while (listad != NULL)
{
paux=listad;
listad=listad->sig;
free(paux);
}
}
/*****************************************************************************************/
void GuardarAgenda(nodoagenda *listad)
{
nodoagenda *paux=listad;
FILE*pFile;

if (paux != NULL)
{
// Recorremos toda la lista hasta el final
while (paux->sig != NULL)
paux=paux->sig;



pFile = fopen ( "amigos.txt" , "wb" );//abrir fichero

if(pFile== NULL)
puts ("\nError guardando el fichero.");
else
{


// Recorremos toda la lista en orden inverso hasta el primer nodo
while (paux != NULL)
{


fwrite(&paux, sizeof paux, 1, pFile);
printf("\n\nDNI: %d",paux->dni);
printf("\nNombre: %s",paux->nombre);
printf("\nApellidos: %s",paux->apellidos);
printf("\nDireccion: %s",paux->direccion);
paux=paux->ant;
}

if( !fclose(pFile) )
printf( "Fichero Guardado\n" );
else
printf( "Error: Fichero NO Guardado\n" );
}
}
}
/*****************************************************************************************/
void LeerAgenda(nodoagenda *listad)
{
nodoagenda *Nuevonodo;

FILE *file = fopen("amigo.txt", "rb");

if ( file != NULL )
{


fclose(file);
}

}

Anselmo
07 de Junio del 2010
Encontre el error en tu codigo

Anselmo
07 de Junio del 2010
El error esta en la línea:

fwrite(&paux,sizeof paux,1,pFile);

Aqui se esta guardando en el archivo el valor del puntero 'paux' en lugar de guardar los datos a los que apunta este puntero.
Lo correcto seria:

fwrite(paux, sizeof(nodoagenda), 1, pFile);